Delphi 为什么OmniThreadLibrary';什么是ForEach阻塞主线程?

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

使用OmniThreadLibrary和Delphi XE4,我希望在后台运行多个处理数据的线程,为我已经存在的代码增加速度

调用下面的过程时,应用程序GUI停止处理任何输入,直到所有线程都完成。我的理解是,使用
.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论坛,这样我就可以在那里问一百万个问题:)我现在正在论坛上工作。出了点问题,但我还不知道原因:(