同步和重叠输入和输出

【勇芳软件工作室】汉化HomePreviousNext

Win32 API支持对文件,命名管道和串行通信设备的同步和异步(或重叠)I / O操作。WriteFileReadFileDeviceIoControlWaitCommEventConnectNamedPipeTransactNamedPipe功能可以同步或异步执行。ReadFileExWriteFileEx功能只能以异步方式执行。

当函数同步执行时,它将不会返回,直到操作完成。这意味着调用线程的执行可以在等待耗时的操作完成时被无限期地阻止。即使操作尚未完成,调用重叠操作的函数也可以立即返回。这样可以在后台执行耗时的I / O操作,而调用线程可以自由执行其他任务。例如,单个线程可以对不同的句柄执行同时的I / O操作,甚至可以在同一句柄上同时进行读写操作。

为了使其执行与重叠操作的完成同步,调用线程使用GetOverlappedResult函数或等待功能之一来确定重叠操作何时完成。您也可以使用HasOverlappedIoCompleted宏轮询完成。

要取消所有挂起的异步I / O操作,请使用CancelIO功能。此函数仅取消调用线程为指定的文件句柄发出的操作。

重叠的操作需要使用FILE_FLAG_OVERLAPPED标志创建的文件,名为管道或通讯设备。要调用函数来执行重叠操作,调用线程必须指定一个指向OVERLAPPED结构的指针。如果此指针为NULL,则函数返回值可能会错误地指示操作已完成。OVERLAPPED结构必须包含手动重置__的句柄,而不是自动重置__事件对象。在完成操作之前,当I / O功能的调用返回时,系统会将事件对象的状态设置为非指定状态。当操作完成时,系统将事件对象的状态设置为发信号。

当调用函数来执行重叠操作时,可以在函数返回之前完成操作。当发生这种情况时,结果将被处理,就像操作已经同步执行一样。但是,如果操作未完成,则函数的返回值为FALSE,GetLastError函数返回ERROR_IO_PENDING。

线程可以通过以下两种方法之一来管理重叠操作:

*使用GetOverlappedResult功能等待重叠操作完成。

*在等待函数返回后,在等待功能之一中指定OVERLAPPED结构的手动复位事件对象的句柄,然后调用GetOverlappedResult.GetOverlappedResult函数返回完成的重叠操作的结果,对于此类信息适用的功能,它会报告传输的实际字节数。

当执行多个同时重叠操作时,调用线程必须为每个操作指定一个具有不同手动复位事件对象的OVERLAPPED结构。要等待任何一个重叠操作完成,该线程将所有手动重置事件句柄指定为多对象等待功能之一中的等待条件。多对象等待功能的返回值指示哪个手动复位事件对象被通知,因此线程可以确定哪些重叠操作导致等待操作完成。

如果OVERLAPPED结构中没有指定事件对象,当重叠操作完成时,系统将通知文件名称为管道或通信设备的状态。因此,您可以将这些句柄指定为等待功能中的同步对象,尽管它们用于此目的可能难以管理。在同一文件,命名管道或通信设备上同时进行重叠操作时,无法知道哪个操作会导致对象的状态被发出信号。对每个重叠操作使用单独的事件对象更为安全。

举例说明使用重叠操作,完成例程和GetOverlappedResult函数,请参阅使用管道.