Windows 立即等待GUI事件和IOCP通知

Windows 立即等待GUI事件和IOCP通知,windows,iocp,message-loop,Windows,Iocp,Message Loop,我是否可以同时在I/O完成端口上等待GUI事件(即,泵送消息循环)?我想将libuv与Windows GUI集成。我知道有两种解决方案。一个可以在所有版本的Windows上运行,但涉及多个线程。另一个更快,但只支持Windows 10+(感谢@RbMm的支持) 另一个线程在循环中调用GetQueuedCompletionStatusEx,并使用SendMessage向主线程发送消息。主线程从其消息循环中读取消息,记录自定义消息类型,并分派I/O完成 此解决方案适用于所有版本的Windows,但速

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

我知道有两种解决方案。一个可以在所有版本的Windows上运行,但涉及多个线程。另一个更快,但只支持Windows 10+(感谢@RbMm的支持)

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

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

  • 主线程使用
    MsgWaitForMultipleObjectsEx
    等待完成端口发出信号或用户输入到达。发出信号后,主线程调用
    GetQueuedCompletionStatusEx
    ,超时时间为零

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


  • 不存在允许您立即等待I/O完成端口和GUI事件的api调用。你需要至少2个独立的线程this@RbMm这可以用未记录的本机API来完成吗?即使使用未记录的本机API(编号和意义),在iocp上通常等待线程池,gui线程也有单独的任务。对于您需要的内容,只使用iocp的单线程并将其与gui结合?@RbMm在gui中使用Node.js或类似工具。我不能在任何线程上运行JS代码,但在主线程上运行。不幸的是,2只能从win 10开始工作。在所有以前的windows版本中,iocp上的任何等待都只返回0(对象被通知),而不管iocp的实际状态如何。这是因为系统不是在iocp本身上等待,而是在iocp类型的公共默认对象上等待。@RbMm谢谢。我将把它添加到我的答案中。从win10开始系统等待iocp本身,然后开始工作。在win8.1系统上等待iocp类型的公共默认对象