【发布时间】:2026-01-09 16:20:02
【问题描述】:
我正在实现一个 Win32 控制台文本编辑器,它有一个内部消息队列,用于传递有关要重绘的区域、与插件之间的消息等的信息。我更喜欢默认情况下它是单线程的(如果没有的话发生需要额外的线程)。我正在考虑2个消息队列实现策略:
- 使用通用队列和Win32事件,所以我可以使用
WaitForMultipleObjectsEx同时等待内部消息和用户输入,同时传递控制台输入句柄和事件句柄。在这种情况下,文本编辑器可以完全存在于单个线程中。 - 使用 I/O 完成端口。在这种情况下,文本编辑器至少需要两个线程,其中一个调用
GetQueuedCompletionStatus来获取消息,另一个读取用户输入并通过PostQueuedCompletionStatus将其发送到队列。控制台输入句柄不能重叠和WaitFor*函数不接受完成端口作为可等待句柄的原因,因此不可能同时等待它们。就像在第一个设置中一样,当没有输入或事件时,两个线程都不会浪费 CPU 时间,但每次按键都必须通过 IOCP 从一个线程传递到另一个线程。
哪种设计总体上更好?
对于文本编辑器来说,通过 IOCP 传递每个按键的性能和延迟是否显着下降?
【问题讨论】:
-
我不了解 Windows,但是您每秒只能获得很少的按键。计算机速度很快。
-
即使线程只是在内核模式下等待,如果你有无意义的线程,你仍然在浪费内存。
-
您是否考虑过使用像Qt 这样的跨平台工具包?然后,您将执行该工具包提供的操作
-
@BasileStarynkevitch 在设计上它必须有一个 Win32 控制台 UI,而不是禁止它有一些其他的,就像 Vim/gVim、Emacs、Neovim 和其他人一样
标签: windows multithreading winapi text-editor iocp