10

適切なコーディングについてアドバイスが必要です。

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

現在、スレッドを作成するときに、メッセージ ループ (Application.Run()) を作成することを選択したので、代わりにバッファをポーリングし、作業がない場合は譲り、単にスレッドを呼び出し (BeginInvoke)、メッセージ ループを次のように使用します。バッファ。これは現在うまく機能しており、これまでのところ深刻な問題はありません。

私の質問は今です:これは「良いコーディング」ですか、それともトレッドでwhileループを使用して代わりにバッファをポーリングする必要がありますか?、または3番目のことですか?

コードを表示したいのですが、これまでのところ数千行のコードです。コードの一部を表示する必要がある場合は具体的に教えてください。:)

ありがとうございました。

4

2 に答える 2

4

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

于 2012-07-25T08:21:49.987 に答える
1

私はあなたがここで何をしているのか 100% 確信が持てませんが、少し「埋める」ことで悪くはありません :)

アプリがアイドル状態 (通信なし) のとき、CPU 使用率は 0% ですか?

あなたのアプリには sleep(0)/sleep(1) や同様のポーリング ループがありませんか?

かなり低いレイテンシーで動作しますか?

答えが 3 つ「はい」の場合は、大丈夫です :)

結果などのポーリングが良いアイデアであるケースがいくつか (非常に少ない!) あります (たとえば、スレッド内のイベントの頻度が非常に高く、すべての進捗イベントを GUI に通知するのがそれを圧倒する場合)。しかし、ほとんどの場合、それは単にデザインが悪いだけです。

于 2012-07-25T08:16:50.230 に答える