私は、再描画する領域、プラグインとの間のメッセージなどについての情報を渡すための内部メッセージキューを持つWin32コンソールのテキストエディタを実装しています。何も起こっていなければ、デフォルトではシングルスレッドであることが好ましい追加のスレッドが必要です)。テキストエディタで各キー押しをあるスレッドから別のスレッドに渡すことはできますか?
- 使用汎用キューとWin32のイベントなので、私が扱うコンソール入力ハンドルとイベントの両方を渡し、同時に内部メッセージとユーザーの入力を待つ
WaitForMultipleObjectsEx
を使用することができます。私は2つのメッセージキューの実装戦略を検討しています。この場合、テキストエディタは1つのスレッド内に完全に存在することができます。 - I/O完了ポートを使用します。この場合、テキストエディタには少なくとも2つのスレッドが必要です。そのうちの1つはメッセージを取得するために
GetQueuedCompletionStatus
を呼び出し、もう1人はユーザ入力を入力してPostQueuedCompletionStatus
によってキューに送信します。コンソールの入力ハンドルが重複できず、WaitFor*
関数が完了可能なポートを待機可能なハンドルとして受け付けないため、同時に待つことができないためです。最初の設定と同じように、入力またはイベントがないときに両方のスレッドがCPU時間を無駄にすることはありませんが、各キーの押下はIOCP経由で別のスレッドに渡されなければなりません。
どのデザインが全体的に優れていますか?
テキストエディタで重要なIOCPを介して各キーを渡す際のパフォーマンスと遅延の問題はありますか?
Windowsはわかりませんが、1秒ごとにキーを押す回数はほとんどありません。コンピュータは高速です。 –
スレッドがカーネルモードで待機しているだけでも、無意味なスレッドがある場合でもメモリを無駄にしています。 – Anders
[Qt](http://qt.io)のようないくつかのクロスプラットフォームツールキットの使用を検討しましたか?そのツールキットが提供するものを実行します –