如何在没有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
,则不需要任何类型的"监视器"并且它也不会阻塞主线程。我没有发送任何类型的消息,所以为什么需要一个" Monitor"?
答案 0 :(得分:2)
你正在做的事情就是使用OmniThreadLibrary进行并行编程
一书中提到的第4.4章错误方法的最简单示例可以写成一行:
CreateTask(MyWorker).Run;
作为一种解决方案,您可以将CreateTask的结果分配给一个变量,该变量的范围涵盖了流程的运行时。
另一种解决方案(正如您自己发现的那样)是使用显示器。