如何将一些参数从主线程传递到工作线程(即以下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
所以我想我的问题的答案是否定的,但我希望不是!
答案 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'过程,该过程可以通过它的任务参数访问Delay
和Message
。即msg := task.Param['Message'];
ASync基本上是CreateTask
的包装器,它自动将它添加到线程池中,抛出一些IOmniTaskConfig支持,并且有一些错误处理的东西。总而言之,它是一个类似于20行代码的类方法。制作自己的ASync版本实现SetParameter过程可能不是一件非常困难的事情。我个人现在太累了,无法干预它,我宁愿在开始攻击之前完成OTL的学习。此外,使用匿名方法捕获变量非常容易。