Delphi 为什么OmniThreadLibrary';什么是ForEach阻塞主线程?
使用OmniThreadLibrary和Delphi XE4,我希望在后台运行多个处理数据的线程,为我已经存在的代码增加速度 调用下面的过程时,应用程序GUI停止处理任何输入,直到所有线程都完成。我的理解是,使用Delphi 为什么OmniThreadLibrary';什么是ForEach阻塞主线程?,delphi,delphi-xe4,omnithreadlibrary,Delphi,Delphi Xe4,Omnithreadlibrary,使用OmniThreadLibrary和Delphi XE4,我希望在后台运行多个处理数据的线程,为我已经存在的代码增加速度 调用下面的过程时,应用程序GUI停止处理任何输入,直到所有线程都完成。我的理解是,使用.NoWait应该允许过程退出,即使线程正在运行 procedure Test(input: TStringList; output: TList<TMaintFore>); var outQueue: IOmniBlockingCollection; transac
.NoWait
应该允许过程退出,即使线程正在运行
procedure Test(input: TStringList; output: TList<TMaintFore>);
var
outQueue: IOmniBlockingCollection;
transaction: TOmniValue;
begin
outQueue := TOmniBlockingCollection.Create;
Parallel.ForEach(0, input.Count - 1)
.NoWait
.Into(outQueue)
.Execute(
procedure(const value: integer; var result: TOmniValue)
begin
result := TMaintFore.Create(input[value]);
end
);
end;
程序测试(输入:TStringList;输出:TList);
变量
出队:IOmniBlockingCollection;
交易:TOmniValue;
开始
outQueue:=TOmniBlockingCollection.Create;
Parallel.ForEach(0,input.Count-1)
诺瓦特先生
.入(出)队
.执行(
过程(常量值:整数;变量结果:TOmniValue)
开始
结果:=tmainfore.Create(输入[值]);
结束
);
结束;
我对ForEach循环的理解是否不正确,建议我应该使用另一种方法来实现后台处理?对于正确使用OmniThreadLibrary的任何建议,我们将不胜感激。您必须将Parallel.ForEach返回的接口存储在全局(form etc)变量中,并仅在ForEach完成执行时销毁它 在您的示例中,ForEach的结果存储在一个临时变量中,该临时变量在测试过程退出时被销毁。ForEach析构函数等待所有任务完成,从而阻塞程序 在任务完成时销毁foreach接口的最安全(但不明显)的方法是使用OnStop方法,并从中向主线程队列发送命令
var
loop: IOmniParallelLoop<integer>;
loop := Parallel.ForEach(1, N).NoWait;
loop.OnStop(
procedure (const task: IOmniTask)
begin
task.Invoke(
procedure
begin
// do anything
loop := nil;
end);
end);
loop.Execute(
procedure (const value: integer)
begin
...
end);
var
循环:IOmniParallelLoop;
loop:=Parallel.ForEach(1,N).NoWait;
loop.OnStop(
程序(常量任务:IOmniTask)
开始
任务.调用(
程序
开始
//做任何事
循环:=nil;
(完),;
(完),;
循环。执行(
过程(常量值:整数)
开始
...
(完),;
这在中有记录。任务完成后,您能安排得到通知吗?谢谢。这对我自己的教育来说更像是个问题,因为我有你在听命于我!;-)“但我想询问者可能也会想知道同样的事情。”garb-谢谢你的快速回复。这解决了我的问题。伟大的图书馆顺便说一句。带回OTL论坛,这样我就可以在那里问一百万个问题:)我现在正在论坛上工作。出了点问题,但我还不知道原因:(