【发布时间】:2012-11-10 19:49:55
【问题描述】:
通过重新初始化,我的意思是停止正在运行的任务(或者甚至杀死线程,如果我必须这样做)并恢复,就好像管道/线程从来没有已初始化/已启动。
我的代码(我使用的是 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的解决方案对我来说就足够了。
提前致谢!
【问题讨论】:
-
发送停止信号。喜欢大自然的意图。我希望 OTL 不会提供执行您提议的滥用行为的例程。
-
谢谢大卫,但正如我已经所说,在这种特殊情况下我对此不感兴趣。我对杀死(或重新初始化管道)而不是很好地停止任务更感兴趣! (是的即使考虑到这种方法的失败)
标签: multithreading delphi delphi-2010 omnithreadlibrary