是否可以在OmniThreadLibrary中重置/重新初始化管道(或BackgroundWorker)?

时间:2012-11-10 19:49:55

标签: multithreading delphi delphi-2010 omnithreadlibrary

通过重新初始化,我的意思是停止正在运行的任务(或者甚至杀死线程,如果必须的话)&恢复,好像管道/线程从未初始化/启动。

我的代码(我使用 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 个答案:

答案 0 :(得分:0)

免责声明:强烈终止线程是不可取的 - 请不要在家中尝试。

我相信你可以做到你想做的事情:

GlobalParallelPool.WaitOnTerminate_sec := 0;
GlobalParallelPool.CancelAll;