通过重新初始化,我的意思是停止正在运行的任务(或者甚至杀死线程,如果必须的话)&恢复,好像管道/线程从未初始化/启动。
我的代码(我使用 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;
FWIW,是的,我完全清楚这是一个坏主意!
我也很清楚,最好的方法是将停止信号发送给任务并等待它们很好地关闭,并经常检查任务中的停止信号。 对于这个特殊情况,我对此并不感兴趣。
虽然上面的代码只提到了管道,但重置BackgroundWorker的解决方案对我来说已足够了。
提前致谢!
答案 0 :(得分:0)
免责声明:强烈终止线程是不可取的 - 请不要在家中尝试。
我相信你可以做到你想做的事情:
GlobalParallelPool.WaitOnTerminate_sec := 0;
GlobalParallelPool.CancelAll;