1

我可以同时等待 GUI 事件(即泵送消息循环)和 I/O 完成端口吗?我想将 libuv 与 Windows GUI 集成。

4

1 回答 1

3

我知道有两种解决方案。一种适用于所有版本的 Windows,但涉及多个线程。另一个更快,但仅支持 Windows 10+(感谢@RbMm 提供这一事实)。

  1. 另一个线程循环调用GetQueuedCompletionStatusEx,并使用 . 向主线程发送消息SendMessage。主线程从它的消息循环中读取消息,记录自定义消息类型,并分派 I/O 完成。

    此解决方案适用于所有版本的 Windows,但速度较慢。但是,如果愿意以延迟换取吞吐量,则可以增加GetQueuedCompletionStatusEx接收缓冲区以恢复与第二种解决方案几乎相同的吞吐量。为获得最佳性能,两个线程应使用相同的 CPU,以避免在 I/O 完成时玩缓存乒乓。

  2. 主线程用于MsgWaitForMultipleObjectsEx等待完成端口发出信号或用户输入到达。一旦发出信号,主线程就会GetQueuedCompletionStatusEx以零超时调用。

    这假设只有一个线程使用的 IOCP 会在 I/O 完成到达时准确地发出信号。这仅适用于 Windows 10 及更高版本。否则,您将忙于循环,因为 IOCP 将始终收到信号。在支持这种方法的系统上,它应该更快,因为它减少了调度开销。

于 2018-01-26T18:44:40.550 回答