再起動コードを表示する必要があると思いますか?スレッドが終了した場合はExecuteプロシージャであることがわかっているので、OSの状態はDONEに変わり、resumeを再度呼び出すと、実際の個別のスレッドではなく、メインスレッドの関数としてのみそのスレッドが開始されます。
ちなみに、このサンプルコードは必要に応じて使用できます
unit UWorker;
interface
uses Windows, Classes, Contnrs;
type
TWorkerThread=class;
TWorkerJob=class
procedure ExecuteJob(Worker: TWorkerThread); virtual; abstract;
end;
TWorkerThread=class(TThread)
private
FFinished: TObjectList;
FNotFinished: TObjectList;
protected
procedure Execute;Override;
public
constructor Create(createSuspended: Boolean);override;
destructor Destroy; override;
public
property Finished: TObjectList read FFinished;
property NotFinished: TObjectList read FNotFinished;
end;
implementation
{ TWorkerThread }
constructor TWorkerThread.Create(createSuspended: Boolean);
begin
inherited;
FFinished := TObjectList.Create;
FNotFinished := TObjectList.Create;
end;
destructor TWorkerThread.Destroy;
begin
FFinished.Free;
FNotFinished.Free;
inherited;
end;
procedure TWorkerThread.Execute;
var
CurrentJob: TWorkerJob;
begin
while not Terminated do
begin
if FNotFinished.Count > 0 then
begin
CurrentJob := TWorkerJob(FNotFinished.Items[0]);
FNotFinished.Extract(CurrentJob);
with CurrentJob do
begin
ExecuteJob(Self);
end;
FFinished.Add(CurrentJob);
end else
begin
// pass the cpu to next thread or process
Sleep(5);
end;
end;
end;
end.
このコードを使用するには、ワーカーを作成してから、ジョブのインスタンスを作成し、それらをNotFinishedリストに追加します。ワーカーはすべてのジョブを1つずつ実行します。ジョブを再開するには、完了リストからジョブを抽出して、NotFinishedに再度追加します。
ジョブを継承し、ExecuteJobプロシージャをオーバーライドする必要があることを忘れないでください。