【问题标题】:Run without TOmniEventMonitor在没有 TOmniEventMonitor 的情况下运行
【发布时间】:2014-07-22 06:35:20
【问题描述】:

如果没有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,它不需要任何类型的“监视器”,也不会阻塞主线程。我没有发送任何类型的消息,为什么需要“监视器”?

【问题讨论】:

  • 一些代码在这里会有所帮助...
  • 如果我正确理解您的问题,您不需要显示器。如果您不将 CreateTask 的结果保存在返回 IOmniTask 的变量中,您只需要一个监视器...我没有打开 Delphi,所以我从内存中输入。
  • @gabr 解决方案是List: TList<IOmniTaskControl> 同样Array 也可以。

标签: delphi delphi-xe6 omnithreadlibrary


【解决方案1】:

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

错误做法最简单的例子可以写成一行:

CreateTask(MyWorker).Run;

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

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

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2020-08-23
    • 2018-06-06
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多