2012-07-25 17 views
10

私は適切なコーディングでいくつかの助言が必要です:良いコーディングですか? (複数のメッセージループ)

私は複数のシリアル接続が使用されているプログラムで作業しています。各通信回線には、抽象化レイヤとして動作するコントローラがあります。コントローラとシリアルポートの間にプロトコルが挿入されてデータをパッケージに包み込み、転送の準備ができます。プロトコルが失敗した配送、再送信などを処理します。 GUIがハングしないように、各接続回線(プロトコルとシリアルポート)は別のスレッドで作成されます。コントローラーはGUIのコントロールを持っているので、メインスレッドによって処理されます。

現在、私はスレッドを作成するときに、メッセージループ(Application.Run())を作成するように選択したので、バッファをポーリングする代わりに仕事がなければ単にスレッド(BeginInvoke)バッファとしてのメッセージループ。これは現在うまく機能し、これまでのところ深刻な問題はありません。

これは「良いコーディング」ですか、それともトレッドにwhileループを使用してポーリングバッファを使用するべきですか?

私はコードを表示したいと思いますが、今のところ数千のコード行ですので、コードの一部を見たい場合は具体的にしてください。 :)

ありがとうございます。

答えて

4

各スレッドでメッセージループを使用すると問題はありません。 Windowsはこのシナリオに合わせて最適化されています。あなたはポーリングを回避するのは当然ですが、転送のためのパッケージを準備して、準備ができたスレッド、またはセマフォとスレッドセーフのキューを通知するためにSetEventを呼び出すなど、より効率的な他のイベントベースの設計を調べることができます。マーティン・ジェイムスが示唆

+0

実際はそうではありません。 WM_COPYDATAは、プロセス間の通信に適しています。 1つのプロセス内でスレッド間通信に使用するのは無意味です。バッファ/ blob /ポインタを使ってオブジェクトを渡すほうがはるかに簡単で簡単です。 * Bufferをメッセージにキャストします。lParam、PostMessage()、 'other end'にキャストバックします。 –

+0

Windowsメッセージキューは、TO GUIスレッドと通信するために最適化されています。 GUIスレッドから非GUIワークスレッドへの通信に最適ではありません。セマフォベースの単純化されていない最適化されたプロデューサ - コンシューマキューであっても、WMQより約4倍高速です。ほとんどのアプリでは、P-Cキューのパフォーマンスは通常問題にはなりません。 –

+0

私は実際に両方の点に同意します。私はWM_COPYDATAを編集します。私ははっきりと考えていませんでした。メッセージキューに関しては、一般化されたイベントベースのソリューションです。彼のアプリの要件に応じて、他のモデルが良いかもしれません。 – tenfour

1

私はあなたがここでやっていることは100%確実ではないんだけど、あなたのアプリケーションがアイドル状態の場合、それは悪い:)

を鳴らない「に充填」(なし途切れ)のビットと、ありますCPU使用率は0%ですか?

あなたのアプリはスリープ(0)/スリープ(1)、または同様のポーリングループから解放されていますか?

それはかなり低い待ち時間で動作しますか?答えは3つある場合

「YES」、あなたは問題ないはずです:)

あり、数、(非常に少ない!)、などの結果のポーリングは良いアイデア、(ある場合など。ときスレッド内のイベントの頻度は非常に高く、GUIへのすべての進捗イベントを通知するとそれを圧倒するでしょう)が、ほとんどの場合、設計が貧弱です。

+0

このプログラムの目的は、それぞれがArduinoを含む1-4個(これまでのところ)のボックスを制御することです。各Arduinoは、シミュレータシステムのデジタルI/Oに接続されています。並列シミュレータシステムには1つのボックスが必要です。シミュレータ。シミュレータは、私が働いている会社のR&Dの一部です。 Windowsプログラムでは、実行時にArduinoのピン配置を再プログラミングし、ピンの高/低状態を読み書きする機能を備えています。 – Anders

+0

トリプルここから..私は、データがないとthread.yieldsとバッファポーリングするようにコードを変更しようとしましたが、プログラムが少し不足してしまったので、メッセージループでうまくいくと思います:) – Anders

+0

まあ、私はちょっと別のキューなどを使っているかもしれませんが、アプリが十分に効率的であれば、すばやく応答し、クラッシュすることはありません。) –

関連する問題