我正在实现一个Win32控制台文本编辑器,它有一个内部消息队列,用于传递有关哪些区域需要重新绘制,消息来自插件等信息。我更喜欢它默认为单线程(如果没有任何事情发生这需要额外的线程)。我考虑2种消息队列实施策略:文本编辑器是否可以将每个按键从一个线程传递到另一个线程?
- 使用通用队列和Win32事件,所以我可以用
WaitForMultipleObjectsEx
同时等待内部消息和用户输入,同时传递控制台输入句柄和事件句柄。在这种情况下,文本编辑器可以完全在一个线程内生存。 - 使用I/O完成端口。在这种情况下,文本编辑器至少需要两个线程,其中一个调用
GetQueuedCompletionStatus
来获取消息,另一个读取用户输入并通过PostQueuedCompletionStatus
将其发送到队列。控制台输入句柄的原因不能重叠,并且WaitFor*
函数不能接受完成端口作为等待句柄,所以不可能同时等待它们。就像在第一个设置中一样,当没有输入或事件时,两个线程都不会浪费CPU时间,但每个按键都必须通过IOCP从一个线程传递到另一个线程。
哪种设计总体上更好?
性能和延迟的缺点是将每个按键通过IOCP传递给文本编辑器很重要吗?
我不知道Windows,但你每秒钟都会得到很少的按键。电脑速度很快。 –
即使线程只是在内核模式下等待,如果您有无意义的线程,您仍然在浪费内存。 – Anders
您是否考虑过使用[Qt](http://qt.io)等跨平台工具包?然后你会做什么工具包提供 –