同步和重叠输入和输出

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

ReadFileWriteFileTransactNamedPipeConnectNamedPipe功能可以同步或异步运行。ReadFileExWriteFileEx功能只能异步运行。当函数同步运行时,它们不会返回,直到操作完成。这意味着调用线程的执行可以在等待耗时的操作完成时被无限期地阻止。当函数异步运行时,即使在操作完成之前它们也会立即返回。这使得在调用线程可以自由执行其他任务的情况下在后台执行耗时的操作。

重叠的操作使得一个管道可以同时读取和写入数据,并且可以使单个线程在多个管道手柄上执行同时的I / O操作。这使得单线程服务器进程能够有效地处理与多个客户端进程的通信。有关说明服务器进程的重叠操作的示例,请参阅服务器使用重叠输入和输出服务器使用完成例程.

对于使用同步操作来与多个客户端通信的服务器进程,它必须为每个客户端进程创建一个单独的线程,以便一个或多个线程可以在其他线程正在等待时运行。有关使用同步操作的多线程服务器进程的示例,请参阅多线程服务器.

命名管道上的重叠操作通过在创建句柄时指定FILE_FLAG_OVERLAPPED标志(通过服务器进程的CreateNamedPipe功能或客户端进程的CreateFile功能)来启用。如果未指定此标志,则禁用重叠模式。创建管道手柄后,管道手柄的重叠模式不能更改。对于相同管道实例的服务器和客户端句柄,重叠模式可能不同。

只有在为指定的管道句柄启用了重叠模式且指定了OVERLAPPED结构的有效指针时,才能异步执行ReadFileWriteFileTransactNamedPipeConnectNamedPipe功能。如果OVERLAPPED指针为NULL,则函数返回值可能会错误地指示操作已完成。因此,强烈建议如果使用FILE_FLAG_OVERLAPPED创建句柄并且需要异步行为,则应始终指定一个有效的OVERLAPPED结构,或者使用用于异步操作的功能,例如ReadFileExWriteFileEx.

ReadFileWriteFileTransactNamedPipeConnectNamedPipe异步执行时,会发生以下结果之一:

*如果函数返回时操作完成,返回值表示操作成功或失败。如果发生错误,则返回值为FALSE,GetLastError函数返回除ERROR_IO_PENDING之外的其他值。

*如果函数返回时操作尚未完成,返回值为FALSE,GetLastError返回ERROR_IO_PENDING。在这种情况下,调用线程必须等待操作完成。调用线程必须调用GetOverlappedResult函数来确定结果。

指定OVERLAPPED结构的【活动】成员必须包含手动重置__的句柄,而不是自动重置__事件对象。这是由CreateEvent函数创建的同步对象。启动重叠操作的线程使用事件对象来确定操作何时完成。有关事件对象的更多信息,请参阅同步.

事件对象处于信令状态或非信号状态。如果一个重叠的函数在其操作完成之前返回,系统将事件对象的状态设置为非信号。操作完成后,系统将状态设置为发信号。该线程可以通过在对等待功能之一的调用中指定事件对象的句柄来检测对象的状态。直到发出指定对象的状态或直到超时间隔过去,这些功能才会返回。对于等待多个对象的等待函数,函数的返回值指示哪些对象被发信号。这样做使服务器进程能够使用执行以下步骤的循环:

1.在对wait函数的调用中指定多个事件对象,然后等待其中一个对象处于信号状态。

2.使用wait函数的返回值确定哪个重叠操作完成。

3.执行清理完成的操作所需的任务,并启动该管道手柄的下一个操作。这可能涉及为相同的管道手柄启动另一个重叠操作。

如果OVERLAPPED结构的【活动】成员是NULL指针而不是事件对象的句柄,调用线程可以使用管道句柄来确定重叠操作何时完成。在这种情况下,系统会将管道句柄的状态设置为发信号或非信号状态,如前面对事件对象的状态所述。强烈建议您在执行重叠操作时始终使用事件对象,而不是依靠管道句柄。特别是,在同一个句柄上执行同时操作时,不要使用管道手柄,因为无法知道哪个操作的完成导致管道句柄发出信号。在同一个管道手柄上执行同时操作的唯一安全技术是为每个操作使用单独的OVERLAPPED结构及其自己的事件对象。

ReadFileExWriteFileEx功能提供了另一种形式的重叠I / O。与使用事件对象来表示完成的重叠ReadFileWriteFile函数不同,扩展函数指定【完成例程】.完成例程是在读取或写入操作完成时排队等待执行的功能。直到调用ReadFileExWriteFileEx的线程通过调用其中一个可警告的等待功能MsgWaitForMultipleObjectsEx进入【警惕的等待】之后,才执行完成例程。SignalObjectAndWait, WaitForSingleObjectEx, or WaitForMultipleObjectsEx.这些功能类似于正常的等待功能,因为它们在指定的对象处于信号状态或超时间隔过去时返回。但是,这些函数也可以执行其【的fAlertable】参数设置为TRUE时发生的警报等待。在等待警报时,当ReadFileExWriteFileEx完成例程排队执行时,这些功能也返回。服务器进程可以使用扩展功能为连接到它的每个客户端执行一系列读写操作。序列中的每个读取或写入操作指定完成例程,并且每个完成例程启动序列中的下一个步骤。