Synchronous and Overlapped Input and Output
The
ReadFile,
WriteFile,
TransactNamedPipe, and
ConnectNamedPipe functions can run either synchronously or asynchronously. The
ReadFileEx and
WriteFileEx functions can run only asynchronously. When functions run synchronously, they
do not return until the operation is finished. This means that the execution
of the calling thread can be blocked for an indefinite period while it waits for
a time-consuming operation to finish. When functions run asynchronously, they
return immediately even before their operations are finished. This enables a
time-consuming operation to be executed in the background while the calling
thread is free to perform other tasks.
Overlapped operations make it possible for one pipe to read and write data
simultaneously and for a single thread to perform simultaneous I/O operations on
multiple pipe handles. This enables a single-threaded server process to handle
communications with multiple client processes efficiently. For examples that
illustrate overlapped operations by a server process, see
Server Using Overlapped Input and Output and
Server Using Completion Routines.
For a server process to use synchronous operations to communicate with more
than one client, it must create a separate thread for each client process so that
one or more threads can run while other threads are waiting. For an example of
a multithreaded server process that uses synchronous operations, see
Multithreaded Server.
Overlapped operations on a named pipe are enabled by specifying the
FILE_FLAG_OVERLAPPED flag when the handle is created (by the
CreateNamedPipe function for a server process or the
CreateFile function for a client process). If this flag is not specified, overlapped
mode is disabled. The overlapped mode of a pipe handle cannot be changed after the
pipe handle has been created. The overlapped mode can be different for server
and client handles to the same pipe instance.
The
ReadFile,
WriteFile,
TransactNamedPipe, and
ConnectNamedPipe functions can be performed asynchronously only if overlapped mode is enabled
for the specified pipe handle and a valid pointer to an
OVERLAPPED structure is specified. If the
OVERLAPPED pointer is NULL, the function return value may incorrectly indicate that the
operation completed. Therefore, it is strongly recommended that if you create a
handle with FILE_FLAG_OVERLAPPED and want asynchronous behavior, you should
always specify a valid OVERLAPPED structure or use the functions intended for
asynchronous operations such as
ReadFileEx and
WriteFileEx.
When
ReadFile,
WriteFile,
TransactNamedPipe, and
ConnectNamedPipe are performed asynchronously, one of the following outcomes occurs:
- If the operation is complete when the function returns, the return value
indicates the success or failure of the operation. If an error occurs, the return
value is FALSE and the GetLastError function returns something other than ERROR_IO_PENDING.
- If the operation has not finished when the function returns, the return value
is FALSE and GetLastError returns ERROR_IO_PENDING. In this case, the calling thread must wait until
the operation has finished. The calling thread must then call the GetOverlappedResult function to determine the results.
The
hEvent member of the specified
OVERLAPPED structure must contain a handle to a manual-reset
not an auto-reset
event object. This is a synchronization object created by the
CreateEvent function. The thread that initiates the overlapped operation uses the event
object to determine when the operation is finished. For more information about
event objects, see
Synchronization.
An event object is either in a signaled or nonsignaled state. If an overlapped
function returns before its operation has finished, the system sets the state
of the event object to nonsignaled. When the operation is finished, the system
sets the state to signaled. The thread can detect the object's state by
specifying a handle to the event object in a call to one of the
wait functions. These functions do not return until the state of a specified object is
signaled or until a time-out interval has elapsed. For the wait functions that wait
for multiple objects, the function's return value indicates which of the
objects is signaled. Doing this enables a server process to use a loop that performs
the following steps:
- Specify multiple event objects in a call to the wait function, then wait for
one of the objects to be in a signaled state.
- Use the wait function's return value to determine which overlapped operation
is finished.
- Perform the tasks necessary to clean up the completed operation and initiate
the next operation for that pipe handle. This may involve starting another
overlapped operation for the same pipe handle.
If the
hEvent member of the
OVERLAPPED structure is a NULL pointer instead of a handle to an event object, the
calling thread can use the pipe handle to determine when an overlapped operation has
finished. In this case, the system sets the state of the pipe handle to
signaled or nonsignaled, as described previously for the state of an event object. It
is strongly recommended that you always use an event object when performing
overlapped operations rather than relying on the pipe handle. In particular, you
should not use the pipe handle for this purpose when performing simultaneous
operations on the same handle because there is no way of knowing which
operation's completion caused the pipe handle to be signaled. The only safe technique for
performing simultaneous operations on the same pipe handle is to use a
separate
OVERLAPPED structure with its own event object for each operation.
The
ReadFileEx and
WriteFileEx functions provide another form of overlapped I/O. Unlike the overlapped
ReadFile and
WriteFile functions, which use an event object to signal completion, the extended
functions specify a
completion routine. A completion routine is a function that is queued for execution when the
read or write operation is finished. The completion routine is not executed until
the thread that called
ReadFileEx and
WriteFileEx enters an
alertable wait by calling one of the alertable wait functions:
MsgWaitForMultipleObjectsEx.
SignalObjectAndWait,
WaitForSingleObjectEx, or
WaitForMultipleObjectsEx. These functions are like the normal wait functions in that they return when
a specified object is in the signaled state or when a time-out interval has
elapsed. However, these functions can also perform an alertable wait that occurs
when their
fAlertable parameter is set to TRUE. In an alertable wait, the functions also return
when a
ReadFileEx or
WriteFileEx completion routine is queued for execution. A server process can use the
extended functions to perform a sequence of read and write operations for each
client that connects to it. Each read or write operation in the sequence specifies
a completion routine, and each completion routine initiates the next step in
the sequence.
- Software for developers
-
Delphi Components
.Net Components
Software for Android Developers
- More information resources
-
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
- Databases for Amazon shops developers
-
Amazon Categories Database
Browse Nodes Database