この質問には、Delphi と XE が特に Suspend と Resume を廃止することが含まれます。私は他の投稿を読みましたが、これまでのところ同様の使用法を見つけていないので、先に進んで議論を求めます.
私が知りたいのは、スレッドが必要ないときにスレッドを一時停止するより良い方法はありますか?
何年も使用してきた Delphi クラスがあります。これは基本的に、スレッド化されたプロセスに関連付けられた FIFO キューです。キューはメイン スレッドでデータ オブジェクトを受け入れ、スレッドが中断されている場合は再開します。
スレッドの実行プロセスの一部として、オブジェクトはキューから取り出され、スレッド上で処理されます。通常、これはデータベース ルックアップを行うためのものです。
プロセスの最後に、オブジェクトのプロパティが更新され、メイン スレッドで使用できるようにマークされるか、別のキューに渡されます。実行プロセスの最後の (実際には最初の) ステップは、キューにアイテムがまだあるかどうかを確認することです。ある場合は続行し、そうでない場合は一時停止します。
それらのキーは、実行ループが完了したときに実行ループ内にある唯一の中断アクションであり、通常の操作中の唯一の再開は、新しいアイテムがキューに配置されたときに呼び出されます。例外は、キュー クラスが終了している場合です。
レジューム機能はこんな感じ。
process TthrdQueue.MyResume();
begin
if Suspended then begin
Sleep(1); //Allow thread to suspend if it is in the process of suspending
Resume();
end;
end;
実行はこれに似ています
process TthrdQueue.Execute();
var
Obj : TMyObject;
begin
inherited;
FreeOnTerminate := true;
while not terminated do begin
if not Queue.Empty then begin
Obj := Pop();
MyProcess(Obj); //Do work
Obj.Ready := true;
end
else
Suspend(); // No more Work
end; //Queue clean up in Destructor
end;
TthrdQueue Push ルーチンは、スタックに別のオブジェクトを追加した後、MyResume を呼び出します。MyResume は、スレッドが中断されている場合にのみ Resume を呼び出します。
シャットダウンするときは、terminate を true に設定し、中断されている場合は MyResume を呼び出します。