2017-09-24 20 views
0

私は、再描画する領域、プラグインとの間のメッセージなどについての情報を渡すための内部メッセージキューを持つWin32コンソールのテキストエディタを実装しています。何も起こっていなければ、デフォルトではシングルスレッドであることが好ましい追加のスレッドが必要です)。テキストエディタで各キー押しをあるスレッドから別のスレッドに渡すことはできますか?

  1. 使用汎用キューとWin32のイベントなので、私が扱うコンソール入力ハンドルとイベントの両方を渡し、同時に内部メッセージとユーザーの入力を待つWaitForMultipleObjectsExを使用することができます。私は2つのメッセージキューの実装戦略を検討しています。この場合、テキストエディタは1つのスレッド内に完全に存在することができます。
  2. I/O完了ポートを使用します。この場合、テキストエディタには少なくとも2つのスレッドが必要です。そのうちの1つはメッセージを取得するためにGetQueuedCompletionStatusを呼び出し、もう1人はユーザ入力を入力してPostQueuedCompletionStatusによってキューに送信します。コンソールの入力ハンドルが重複できず、WaitFor*関数が完了可能なポートを待機可能なハンドルとして受け付けないため、同時に待つことができないためです。最初の設定と同じように、入力またはイベントがないときに両方のスレッドがCPU時間を無駄にすることはありませんが、各キーの押下はIOCP経由で別のスレッドに渡されなければなりません。

どのデザインが全体的に優れていますか?

テキストエディタで重要なIOCPを介して各キーを渡す際のパフォーマンスと遅延の問題はありますか?

+0

Windowsはわかりませんが、1秒ごとにキーを押す回数はほとんどありません。コンピュータは高速です。 –

+0

スレッドがカーネルモードで待機しているだけでも、無意味なスレッドがある場合でもメモリを無駄にしています。 – Anders

+0

[Qt](http://qt.io)のようないくつかのクロスプラットフォームツールキットの使用を検討しましたか?そのツールキットが提供するものを実行します –

答えて

2

IOCPのパフォーマンスと遅延は、目的に応じて適切です。しかし私は各キープレスをPostQueuedCompletionStatusに翻訳しません。私は、PostConnectionInputから何を得ても、複数のキー操作を一度にエンキューするためにPostQueuedCompletionStatusを使用したいと思います。

パフォーマンスの差はごくわずかだと思いますが、環境によってはどちらかが速くなる可能性があります。 WaitForMultipleObjectsは実装がはるかに簡単です。

P.S.メッセージキューはまったく必要ですか?これらの再描画要求/プラグインメッセージを、それらを起動したスレッドで処理しないでください。コンソール出力とあなたの共有状態をガードするクリティカルセクション?輻輳が100Hzのメッセージ+ 15Hzのキー押下のように低く、処理速度が速い場合、IOCPや他のキューよりも待ち時間が短縮されます。ロック/アンロック用のカーネル。これはまた、設計を簡素化します。あなたのメインスレッドはReadConsoleInput()呼び出しをブロックする際にスリープします。その前にWaitForを呼び出す必要はありません。

+0

ありがとうございました!あなたが提案した同期メッセージングを考えてみましょう。メッセージの種類によっては、はるかに優れています。メッセージキュー+ WaitFor */'GetQueuedCompletionStatus'を持つ理由は、Alertable I/OまたはIOCPを介してメインスレッドでI/Oを実行する可能性があります。また、すべてが完全にリエントラントである必要はありません(私の理解が正しい場合)すべてがインプレースで呼ばれている場合。 – jhkouy78reu9wx

+0

@ jhkouy78reu9wx IOCPは、完了要求を処理する複数のスレッドがあるか、MAXIMUM_WAIT_OBJECTS = 64以上の同時ストリームがある場合、警告可能なI/Oよりもはるかに優れています。そのストリームがたくさんない場合は、WaitForMultipleObjectsもIOCPと同じくらい速いと期待しています。 async IOと同じキュー内のコンソール入力を処理することは面白いかもしれません。ユーザーはキーを最大10Hzまで押しますが、非同期IOは1KHz以上の速度で完了できますが、レイテンシーでユーザー入力を優先します。 WaitForMultipleObjectsは、それを優先してハンドルを優先します。 – Soonts

関連する問題