在没有TOmniEventMonitor的情况下运行

时间:2014-07-22 06:35:21

标签: delphi delphi-xe6 omnithreadlibrary

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

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,则不需要任何类型的"监视器"并且它也不会阻塞主线程。我没有发送任何类型的消息,所以为什么需要一个" Monitor"?

1 个答案:

答案 0 :(得分:2)

你正在做的事情就是使用OmniThreadLibrary进行并行编程

一书中提到的第4.4章

  

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

     

CreateTask(MyWorker).Run;

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

另一种解决方案(正如您自己发现的那样)是使用显示器。