在 Cap'n Proto RPC 服务器中定期运行函数
Run function periodically in Cap'n Proto RPC server
我有一个Cap'n Proto RPC服务器,可以在窗口中运行一些OpenGL命令。我对窗口的事件完全不感兴趣,但为了避免在 Windows 上被杀死,我需要每秒轮询一次事件。我怎样才能以简单的方式做到这一点?
我读过你可以制作自己的EventPort,但我无法弄清楚如何实际使用EventPorts。当我实际上对这些事件不感兴趣时,这也可能是矫枉过正。如果可能的话,我想优先考虑 RPC 事件而不是轮询窗口。
使用 EZ-rpc 以外的其他东西并不是缺点,因为我想稍后转向共享内存通信。
因此,Windows 事件处理中存在以下严重缺陷:处理网络 I/O 的最佳方法(尤其是具有许多连接(是通过 I/O 完成端口 (IOCP(。但是,不幸的是,Windows 无法让线程在同一线程中等待 IOCP 事件和 GUI 事件。这似乎是 Win32 API 中的一个严重设计缺陷,但几十年来一直如此。更奇怪的是,内部NT内核API实际上确实支持替代方案(具体来说,它们允许通过APC传递I/O完成事件(,但Microsoft尚未公开这些API,因此使用它们的应用程序可能会在未来版本的Windows中中断。
因此,基本上有两种方法可以设计一个同时执行网络 I/O 并实现 GUI 的程序:
-
使用基于
MsgWaitForMultipleObjectsEx
的事件循环,而不是 IOCP。您将被限制为不超过 64 个连接,并且事件循环的效率相对较低。 -
具有用于网络和 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()
这样的较低级别的构建块。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在 Cap'n Proto RPC 服务器中定期运行函数
- 服务器 API 不响应 Curl 函数
- 执行析构函数时,服务器应用程序总是崩溃
- 使用 select() 函数改进服务器
- 服务器 UDP 函数接收自
- 函数cgi.FieldStorage冻结Python HTTPS服务器
- php函数执行-连接php和基于c++的服务器
- 使用Winsock 7c++从服务器向客户端发送函数调用的最有效方法
- 套接字编程C/ c++ - recv函数在服务器端挂起
- COM服务器作为windows服务,不能将数组作为函数参数传递
- 通过IDispatch公开COM函数的服务器如何区分调用函数而不传递任何ID参数的不同客户端?