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