メインアプリケーションスレッドが他の作業スレッドを一時停止/再開できるようにしたいのですが、これが可能であると仮定すると、これを行う最良の方法は何ですか?
Windows XP (およびそれ以降) で動作する提案は大歓迎です!
PS。Delphi 2010とOmniThreadLibrary 3を使用しています
メインアプリケーションスレッドが他の作業スレッドを一時停止/再開できるようにしたいのですが、これが可能であると仮定すると、これを行う最良の方法は何ですか?
Windows XP (およびそれ以降) で動作する提案は大歓迎です!
PS。Delphi 2010とOmniThreadLibrary 3を使用しています
OmniThreadLibrary は、スレッドを中断するためのコマンドを公開していません。スレッドを中断する API メソッドは を呼び出すSuspendThread
ことであり、その関数は 2 つの場所でのみ呼び出され、どちらもライブラリの外部から直接使用することはできません。
がある場合は、そのプロパティTOTPWorkerThread
を呼び出すことができます。SuspendThread
Handle
スレッド自体のコンテキストの外部からスレッドを中断する安全で推奨される方法はありません。これを行うと、常に問題が発生します。これは、外部スレッドが中断を試みた時点で他のスレッドが何を行っているかを正確に認識できないためです。I/O ステートメントの途中であるか、他のスレッドが待機しているロックを保持している可能性があります。
スレッドを中断するための安全で推奨される方法は、それ自体を中断させたいという何らかの通知をスレッドに送信することです。OmniThreadLibrary のコンテキスト内では、これCancel
はワーカー スレッドでの呼び出しを意味する場合があります。
スレッドを一時停止するより良い方法は、スレッドをまったく一時停止しないことです。スレッドを一時停止する通常のケースは、その時点で実行することが何も残っていない場合です。そのため、何かが利用可能になったときにスレッドを起動して、新しい作業の処理を続行できるようにする必要があります。ただし、中断せずにそれを行うことができます。代わりに、作業項目を含むキューでスレッドを待機させます。OmniThreadLibrary には、そのためのメカニズムがいくつかあります。各作業単位を個別のタスクに入れ、それらのタスクをスレッド プールに入れることができます。タスクを単純なキューに入れ、1 つのスレッドをキューで動作させることもできます。