如何将参数传递给OmniThreadLibrary中的Parallel.Async()?

时间:2013-05-16 16:03:45

标签: delphi omnithreadlibrary

如何将一些参数从主线程传递到工作线程(即以下procedure)?

Parallel.Async(
  procedure (const task: IOmniTask)
  begin
    //How does one pass in 'myParam' from the main thread, so that the statement bellow will work?
    s := task.Param['myParam'].AsString;
  end
);

如果您检查IOmniTaskConfig的定义(在OtlParallel.pas中),则会有一个名为commented out的{​​{1}}属性,如下所示:

Param

所以我想我的问题的答案是否定的,但我希望不是!

2 个答案:

答案 0 :(得分:4)

您需要为此使用变量捕获。

var
  MyParam: Integer;
....
MyParam := 42;
Parallel.Async(
  procedure(const task: IOmniTask)
  begin
    Foo(MyParam);
  end
);

如果您不熟悉匿名方法的变量捕获,请在documentation中详细讨论。

答案 1 :(得分:4)

我的简短回答

Parallel.Async旨在与匿名方法一起使用,这样做可以让你从调用方法中捕获变量(正如David Heffernan已经证明的那样)。

我的答案很长(因为你特别询问了Param系列)

您的代码段中的task.Param未引用IOmniTaskConfig界面中的属性。它引用IOmniTaskControl接口中的Param属性。这是一个合法的属性,但据我所知(考虑到我刚刚开始查看OTL并且尚未使用它,这并不是很多),你必须编写自己的ASync程序以任何有意义的方式写入房产。

开箱即用,Param属性旨在与OTL的低级功能一起使用。例如:

FHelloTask :=
   CreateTask(RunHello, 'Hello')
   .SetParameter('Delay', 1000)
   .SetParameter('Message', 'Hello')
   .OnMessage(HandleTaskMessage)
   .OnTerminated(HandleTaskTerminated)
   .Run;

该代码将创建一个线程并运行'RunHello'过程,该过程可以通过它的任务参数访问DelayMessage。即msg := task.Param['Message'];

ASync基本上是CreateTask的包装器,它自动将它添加到线程池中,抛出一些IOmniTaskConfig支持,并且有一些错误处理的东西。总而言之,它是一个类似于20行代码的类方法。制作自己的ASync版本实现SetParameter过程可能不是一件非常困难的事情。我个人现在太累了,无法干预它,我宁愿在开始攻击之前完成OTL的学习。此外,使用匿名方法捕获变量非常容易。