我可以等待GUI事件 - 也就是说,泵送消息循环 - 同时在I / O完成端口上吗?我想将libuv与Windows GUI集成。
答案 0 :(得分:1)
我知道有两种解决方案。一个适用于所有版本的Windows,但涉及多个线程。另一个更快,但只支持Windows 10+(谢谢@RbMm这个事实)。
另一个线程在循环中调用GetQueuedCompletionStatusEx
,并使用SendMessage
将消息发送到主线程。主线程从其消息循环中读取消息,记录自定义消息类型,并调度I / O完成。
此解决方案适用于所有版本的Windows,但速度较慢。但是,如果愿意为吞吐量交换延迟,可以增加GetQueuedCompletionStatusEx
接收缓冲区以恢复与第二种解决方案几乎相同的吞吐量。为了获得最佳性能,两个线程应使用相同的CPU,以避免与I / O完成一起播放缓存乒乓。
主线程使用MsgWaitForMultipleObjectsEx
等待完成端口发出信号或用户输入到达。一旦发出信号,主线程就会以零超时调用GetQueuedCompletionStatusEx
。
这假设只有一个线程使用的IOCP在I / O完成到达时才会准确发出信号。这仅适用于Windows 10及更高版本。否则,您将忙于循环,因为IOCP将始终发出信号。在支持此方法的系统上,它应该更快,因为它可以减少调度开销。