一度に数秒間実行されるスレッド(100)がいくつかあります。それらが実行されているとき、それらは別のシステム(シリアルデバイス)からの応答を待つためにその時間のかなりの時間を費やします。一度に100個のスレッドを実行することはリソースを大量に消費する可能性があることを念頭に置いているので、実際には一度に開始できるスレッドの数を制限しています。
スレッド内で外部イベントを待つには良い方法と悪い方法があるはずですが、私には思い浮かびます。このアプローチはCPUを集中的に使用しますか?:
send command ;
repeat
until response arrived ;
process response ;
そして、このアプローチはそれをより効率的にしますか?:
send command ;
repeat
Sleep (20) ;
until response arrived ;
process response ;
* 追加情報 *
環境はx86WindowsXPです。スレッドコードは、シリアルデバイスとの長く複雑な一連の対話ですが、一般に、COMポートに文字を書き込み(AsyncFreeシリアルライブラリを使用)、着信文字バッファにキャンプして文字が返されるのを待機します。それらが到着したときにそれらを処理します。シリアルライブラリがデバイスの読み取りと書き込みを行うと思います。スレッド内の時間は、1分から数秒まで長くなる可能性がありますが、その時間のほとんどは、文字がポートを離れるのを待つか、応答文字を待つ(ボーレートが遅い)ために費やされます。したがって、スレッドが待機中に動作するための最良の方法についての私の質問。現在、私はSleep
ループで呼び出していますCharactersInBuffer
ゼロ以外になり、各文字が到着したときに処理し、完全な応答が得られたらスレッドを終了します。したがって、コードは次のようになります(タイムアウトの処理などを無視します)。
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;