-1

我如何在没有 的情况下运行任务TOmniEventMonitor?如果我在没有它的情况下启动它们,主线程就会冻结。这没有任何意义,因为OmniThreadLibrary应该基于TThread. UnObserved并没有真正解决这个问题,因为它只是制作同一事物的内部副本。

type
  TWorker = class(TOmniWorker)
    function Initialize: Boolean; override;
    constructor Create;
  end;

begin
var
  Task: IOmniTaskControl;
begin
  Task := CreateTask(TWorker.Create()).Run; // blocks main thread
  Task := CreateTask(TWorker.Create()).UnObserved.Run; // will create internal monitor each time
  Task := CreateTask(TWorker.Create()).OnTerminated().Run; // will create internal monitor each time
end.

如果我创建一个TThread它不需要任何类型的“监视器”,它也不会阻塞主线程。我没有发送任何类型的消息,为什么需要“监视器”?

4

1 回答 1

2

您正在做的正是OmniThreadLibrary 并行编程一书中第 4.4 章提到的事情

错误方法的最简单示例可以写成一行:

CreateTask(MyWorker).Run;

作为一种解决方案,您可以将 CreateTask 的结果分配给一个变量,其范围涵盖了流程的运行时间。

另一个解决方案(正如您自己发现的那样)是使用监视器。

于 2014-07-22T07:16:54.480 回答