アプリケーションには補助スレッドがあります。このスレッドは常に実行されることを意図したものではありませんが、メインプロセスは非常に頻繁に呼び出すことができます。
だから、私の質問は、CPUパフォーマンスの観点からより最適なものは何ですか?スレッドが使用されていないときにスレッドを一時停止するか、スレッドを存続させて、メインプロセスからの信号を待つためにWaitForSingleObject関数を使用しますか?
アプリケーションには補助スレッドがあります。このスレッドは常に実行されることを意図したものではありませんが、メインプロセスは非常に頻繁に呼び出すことができます。
だから、私の質問は、CPUパフォーマンスの観点からより最適なものは何ですか?スレッドが使用されていないときにスレッドを一時停止するか、スレッドを存続させて、メインプロセスからの信号を待つためにWaitForSingleObject関数を使用しますか?
使用されるCPUリソースに関しては、両方のソリューションは同じです。中断されているスレッドと、WaitForSingleObjectで信号が送信されていないオブジェクトを待機しているスレッドは、どちらもCPUサイクルをまったく取得しません。
とは言うものの、WaitForSingleObjectを使用するコードははるかに「自然」であり、読みやすく、正しく作成しやすいため、ほとんどの場合、WaitForSingleObjectが推奨されるソリューションです。スレッドの一時停止/再開は危険な場合があります。これは、スレッドを一時停止しても害がない状態でスレッドを一時停止していることを確認するために細心の注意を払う必要があるためです(現在ミューテックスを保持しているスレッドを一時停止することを想像してください)。
Andrei は Delphi を使用して .NET を記述していないため、Suspend は System.Threading.Thread.Suspend ではなくSuspendThread Win32 API に変換されると思います。
私はそれに反対することを強く提案します。任意の瞬間にスレッドを中断すると、何が起こるかわかりません (たとえば、一部の共有リソースがブロックされているような状態でスレッドを中断する可能性があります)。ただし、スレッドがサスペンド可能な状態にあることがすでにわかっている場合は、単純に WaitForSingleObject (またはその他の WaitFor 呼び出し) を使用します。これは、スレッドをサスペンドするのと同じように効果的です。つまり、スレッドは、起動されるまで CPU 時間をゼロにします。
「サスペンド」とはどういう意味ですか?WaitForSingleObjectはスレッドを一時停止します。つまり、シグナルが到着するまでCPUを消費しません。
外部に作業単位が与えられているワーカースレッドの場合は、CPUを不必要に使用しないようにするために、シグナリングオブジェクトを使用する必要があります。
それが同様に行うべき独自の仕事のいずれかを持っている場合、それは別の問題です。別のスレッドからスレッドを一時停止しません(2つのスレッドがスレッドに作業を提供している場合はどうなりますか?)-私の基本的なルールは、スレッドは他のスレッドからの提案で自分の存続期間を制御する必要があるということです。これにより、すべての制御がスレッド自体にローカライズされます。
Delphi でのマルチスレッドに関する優れたチュートリアルを参照してください: Multi Threading Tutorial
もう 1 つのオプションは、Delphi 2009 で導入された TMonitor です。これには、Wait、Pulse、PulseAll などの機能があり、スレッドに対して何もすることがないときにスレッドを非アクティブに保ち、作業を続行する必要があるときにすぐに通知します。これは、Java でオブジェクトがロックされた後、大まかにモデル化されています。そこと同様に、Delphi オブジェクトには、スレッドの同期に使用できる「ロック」フィールドが追加されました。
スレッド化されたキュー クラスの例を示すブログは、http://delphihaven.wordpress.com/2011/05/04/using-tmonitor-1/にあります。
残念ながら、TMonitor の実装にバグがありましたが、XE2 で修正されたようです。