5

バックグラウンド スレッドに基づいて割り込み可能なタスクを実装したいと考えています。メソッドを実装する最もクリーンな方法は何TTask.Stopですか? バックグラウンド スレッドを中止するにはどうすればよいですか?

Terminatedスレッド コンテキスト内で実行されるコードは、匿名メソッドを使用してタスクに渡され、ブロッキング呼び出しを含めることができるため、フラグがコード内から定期的にチェックされるという事実に頼ることはできません。

ご意見ありがとうございます。

問題が発生した場合に備えて D2010 を使用する (一部TThread変更されているようです)

4

2 に答える 2

7

実行中のスレッドを安全に中止する方法はありません。これは、Delphiで記述されているかどうか、およびDelphi2010以前を使用しているかどうかに関係なくWindowsプログラムに当てはまります。それを呼び出したい場合はOSの制限ですが、実際にはスレッドの制限です。ロックを保持していないことを確認せずにスレッドを中止するなど、プログラムに大混乱をもたらします。

あなたができることは、TerminateThread()であるAPI関数を呼び出すことです。このリンクにある問題と警告のリストを読んで、それでも電話をかけたいかどうかを確認してください。タスクコードの協力なしに機能する方法は他にありません。

于 2009-11-06T11:47:47.490 に答える
7

ジョブを別のプロセスに分離します。バックグラウンド ジョブとの通信方法にもよりますが、これがおそらく正常に中止できることを保証する最善の方法です。

たとえば、通信に共有メモリを使用するのはおそらく適切ではありません。ファイルやパイプ、または相手が殺されても壊れたり停止したりしない同様のメカニズムを使用してください。プロセス間の同期に名前付きミューテックスを使用する場合は、これらの同期プリミティブに特定のエラー状態があることに注意してください: WAIT_ABANDONED は、プリミティブを最後に保持したスレッド (または暗黙のうちにプロセスのメイン スレッド) がきれいに解放せずに終了しました。基本的に、これはデータ転送に段階的なトランザクション アプローチを使用する必要があることを意味します。これにより、終了時に変更されていた一貫性のない状態を無視できるようになります。

于 2009-11-06T12:18:41.323 に答える