1

再初期化とは、実行中のタスクを停止する(または必要に応じてスレッドを強制終了する) ことを意味し、パイプライン/スレッドが初期化/開始されていないかのように元に戻します。

私のコード(私はdelphi 2010、OmniThreadLibrary 3.02を使用しています)は次のようになります:

procedure SomeProc();
var
   AFile : TOmniValue;
begin
     APipeline := Parallel.Pipeline.NumTasks(5).Stage(StageProc).Run;

     AFile.CreateNamed(['FileID', FileID, 'FileName', FileName]);
     MyPipeline.Input.Add(AFile);
end;
// --------------- //
procedure StageProc(const Input, Output : IOmniBlockingCollection; const Task : IOmniTask);
begin
    // ...
end;

私はこのようなものが必要です:

// --------------- //
procedure ResetPipeline();
begin
     // Stop any task running inside StageProc() & reset pipeline, ie.
     KillTasks(pipeline);
     pipeline := nil;
end;

ノート

  1. FWIW、はい、これが本当に悪い考えであることは十分承知しています!

  2. また、タスクに停止信号を送信し、タスクが適切にシャットダウンするのを待ち、タスク内の停止信号を頻繁に確認することが最善の方法であることもよく知っています。この非常に特殊なケースについては、私はそれには興味がありません。

  3. 上記のコードはパイプラインについてのみ言及していますが、BackgroundWorker をリセットするソリューションで十分です。

前もって感謝します!

4

1 に答える 1

0

免責事項: スレッドの強制終了はお勧めできません。自宅でこれを試さないでください。

私はあなたがこのようにやりたいことができると信じています:

GlobalParallelPool.WaitOnTerminate_sec := 0;
GlobalParallelPool.CancelAll;
于 2012-11-10T20:08:29.803 に答える