Delphi OTL-按需终止任务
如何按需终止任务?当我这样做时:Delphi OTL-按需终止任务,delphi,delphi-xe2,omnithreadlibrary,Delphi,Delphi Xe2,Omnithreadlibrary,如何按需终止任务?当我这样做时: CreateTask(TWorker.Create()) .Invoke(@TWorker.Execute) .MonitorWith(FEventMonitor) .SetParameter('ThreadID',i) .Join(FWorkers) .WithL
CreateTask(TWorker.Create())
.Invoke(@TWorker.Execute)
.MonitorWith(FEventMonitor)
.SetParameter('ThreadID',i)
.Join(FWorkers)
.WithLock(FLockToken).Schedule(GlobalOmniThreadPool).WaitFor(0);
if Assigned(FWorkers) then begin
// FWorkers.TerminateAll; freeze
FWorkers.TerminateAll(0); // freeze
FWorkers:=nil;
GlobalOmniThreadPool.CancelAll;
Log('All tasks stopped',Form1.Memo1);
end
else begin
Log('Nothing to stop',Form1.Memo1);
end;
主应用程序冻结。我是否在外面运行它并不重要
或者在调试器内部,即使只有一个任务正在运行
因为我不想在任务中重复这个代码30次。让用户和编程人员感到沮丧
If GlobalCancel=true then
Task.Terminate;
如果不这样做,应该有一种全局性的方法。您可能不想这样做,但这就是您取消任务的方式。@DavidHeffernan不应该这样做。我的任务有1000多行代码。谁来检查任务是否在每一行都被终止..不,真的,这就是它要做的。不是每一行。但这已经足够了。先发制人地终止任务或线程会导致共享对象处于定义错误的状态。你泄漏了内存。您使锁处于不一致的状态。你会遇到死锁等等。@DavidHeffernan根据gabr的论坛,这个功能甚至还没有实现,库的版本是3.00。。“目前,OTL基础设施不支持按需终止线程。”是的,我认为Primoz非常理解为什么先发制人地终止任务/线程是不明智的。