【问题标题】:Run function periodically in Cap'n Proto RPC server在 Cap'n Proto RPC 服务器中定期运行函数
【发布时间】:2018-08-16 17:26:13
【问题描述】:

我有一个 Cap'n Proto RPC 服务器,它在一个窗口中运行一些 OpenGL 命令。我对窗口的事件根本不感兴趣,但为了避免在 Windows 上被杀死,我需要大约每秒轮询一次事件。我怎样才能以简单的方式做到这一点?

我读到您可以制作自己的 EventPort,但我不知道如何实际使用 EventPort。当我实际上对这些事件不感兴趣时​​,这也可能是矫枉过正。如果可能的话,我希望 RPC 事件优先于轮询窗口。

使用 EZ-rpc 以外的其他东西并不是一个缺点,因为我想稍后转向共享内存通信。

【问题讨论】:

    标签: c++ event-loop capnproto


    【解决方案1】:

    因此,Windows 事件处理存在一个严重缺陷:处理网络 I/O(尤其是有很多连接时)的最佳方式是通过 I/O 完成端口 (IOCP)。然而,不幸的是,Windows 无法让线程在同一线程中等待 IOCP 事件和 GUI 事件。这似乎是 Win32 API 中的一个严重设计缺陷,但几十年来一直如此。更奇怪的是,内部 NT 内核 API 实际上支持替代方案(特别是,它们允许通过 APC 传递 I/O 完成事件)但 Microsoft 尚未公开这些 API,因此使用它们的应用程序将来可能会中断Windows 版本。

    因此,基本上有两种方法可以设计同时进行网络 I/O 和实现 GUI 的程序:

    1. 使用基于 MsgWaitForMultipleObjectsEx 的事件循环而不是 IOCP。您将被限制为不超过 64 个连接,并且事件循环将相对低效。

    2. 为网络和 GUI 提供单独的线程。

    对于您的用例,听起来#1 可能没问题,但还有另一个问题:KJ 事件循环库(Cap'n Proto 使用)还没有实现这种情况。它只实现基于 IOCP 的网络。在kj/async-win32.h 中定义了一个类Win32WaitObjectThreadPool,用于处理GUI 事件循环方法……但目前尚未实现。 (如果您愿意贡献,欢迎 PR!)

    如果您真的不关心及时处理 GUI 事件,那么也许黑客会起作用:您可以使用 kj::Timer 创建一个等待一秒钟的循环,然后检查 Win32 GUI 事件队列,然后再次等待,依此类推。这真的很难看,但可能很容易实现。我不确定kj::Timer 是否通过 EZ-rpc 公开,因此您可能不得不转而使用 kj::setupAsyncIo() 等较低级别的构建块。

    【讨论】:

    • kj::Timer 听起来像我正在寻找的东西。一个单独的线程可以稍微加快我的应用程序,所以将来可能会很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多