我正在實現一個Win32控制檯文本編輯器,它有一個內部消息隊列,用於傳遞有關哪些區域需要重新繪製,消息來自插件等信息。我更喜歡它默認爲單線程(如果沒有任何事情發生這需要額外的線程)。我考慮2種消息隊列實施策略:文本編輯器是否可以將每個按鍵從一個線程傳遞到另一個線程?
- 使用通用隊列和Win32事件,所以我可以用
WaitForMultipleObjectsEx
同時等待內部消息和用戶輸入,同時傳遞控制檯輸入句柄和事件句柄。在這種情況下,文本編輯器可以完全在一個線程內生存。 - 使用I/O完成端口。在這種情況下,文本編輯器至少需要兩個線程,其中一個調用
GetQueuedCompletionStatus
來獲取消息,另一個讀取用戶輸入並通過PostQueuedCompletionStatus
將其發送到隊列。控制檯輸入句柄的原因不能重疊,並且WaitFor*
函數不能接受完成端口作爲等待句柄,所以不可能同時等待它們。就像在第一個設置中一樣,當沒有輸入或事件時,兩個線程都不會浪費CPU時間,但每個按鍵都必須通過IOCP從一個線程傳遞到另一個線程。
哪種設計總體上更好?
性能和延遲的缺點是將每個按鍵通過IOCP傳遞給文本編輯器很重要嗎?
我不知道Windows,但你每秒鐘都會得到很少的按鍵。電腦速度很快。 –
即使線程只是在內核模式下等待,如果您有無意義的線程,您仍然在浪費內存。 – Anders
您是否考慮過使用[Qt](http://qt.io)等跨平臺工具包?然後你會做什麼工具包提供 –