私は適切なコーディングでいくつかの助言が必要です:良いコーディングですか? (複数のメッセージループ)
私は複数のシリアル接続が使用されているプログラムで作業しています。各通信回線には、抽象化レイヤとして動作するコントローラがあります。コントローラとシリアルポートの間にプロトコルが挿入されてデータをパッケージに包み込み、転送の準備ができます。プロトコルが失敗した配送、再送信などを処理します。 GUIがハングしないように、各接続回線(プロトコルとシリアルポート)は別のスレッドで作成されます。コントローラーはGUIのコントロールを持っているので、メインスレッドによって処理されます。
現在、私はスレッドを作成するときに、メッセージループ(Application.Run())を作成するように選択したので、バッファをポーリングする代わりに仕事がなければ単にスレッド(BeginInvoke)バッファとしてのメッセージループ。これは現在うまく機能し、これまでのところ深刻な問題はありません。
これは「良いコーディング」ですか、それともトレッドにwhileループを使用してポーリングバッファを使用するべきですか?
私はコードを表示したいと思いますが、今のところ数千のコード行ですので、コードの一部を見たい場合は具体的にしてください。 :)
ありがとうございます。
実際はそうではありません。 WM_COPYDATAは、プロセス間の通信に適しています。 1つのプロセス内でスレッド間通信に使用するのは無意味です。バッファ/ blob /ポインタを使ってオブジェクトを渡すほうがはるかに簡単で簡単です。 * Bufferをメッセージにキャストします。lParam、PostMessage()、 'other end'にキャストバックします。 –
Windowsメッセージキューは、TO GUIスレッドと通信するために最適化されています。 GUIスレッドから非GUIワークスレッドへの通信に最適ではありません。セマフォベースの単純化されていない最適化されたプロデューサ - コンシューマキューであっても、WMQより約4倍高速です。ほとんどのアプリでは、P-Cキューのパフォーマンスは通常問題にはなりません。 –
私は実際に両方の点に同意します。私はWM_COPYDATAを編集します。私ははっきりと考えていませんでした。メッセージキューに関しては、一般化されたイベントベースのソリューションです。彼のアプリの要件に応じて、他のモデルが良いかもしれません。 – tenfour