【问题标题】:Is it possible to send messages between Tasks (OmniThreadLibrary)?是否可以在任务(OmniThreadLibrary)之间发送消息?
【发布时间】:2011-01-13 14:41:07
【问题描述】:

我的应用将针对各种操作包含多个任务。
所有任务都在 FormCreate 中创建并在 FormDestroy 中终止,只要应用程序运行,它们就会一直运行。
主线程的唯一目的是处理用户 I/O 并将用户输入发送到适当的任务或接收要在主窗体中显示的任务信息。

会有一些数据需要在任务之间传输。
示例:
我将让任务 A 进行数据处理。
它会将部分结果发送到主线程进行显示。
它还必须向任务 B 发送一些(其他)数据,任务 B 会将数据传输到另一台 PC。
任务 C 将从硬件设备接收一些数据,并将这些数据发送给任务 A 进行处理。
等等……

据我所知,使用 OmniThreadLibrary 发送消息始终在任务和创建任务的线程之间(主线程和任务 A,或主线程和任务 B)。

如何在任意两个任务之间直接发送消息?

或者到目前为止我的方法有什么问题,应该完全不同吗?

【问题讨论】:

    标签: delphi delphi-2009 omnithreadlibrary


    【解决方案1】:

    可能。您必须在所有者中创建一个通信通道并将其传递给这两个任务。然后在任务中调用 Task.RegisterComm 来注册此通信通道。从那时起,在此通道上收到的所有消息都将使用标准的 OmniThreadLibrary 机制进行分派(即就像它们是从所有者发送的一样)。

    示例见演示 08_RegisterComm。

    procedure TfrmTestRegisterComm.FormCreate(Sender: TObject);
    begin
      FCommChannel := CreateTwoWayChannel(1024);
      FClient1 := CreateTask(TCommTester.Create(FCommChannel.Endpoint1))
        .Run;
      FClient2 := CreateTask(TCommTester.Create(FCommChannel.Endpoint2))
        .Run;
    end;
    
    function TCommTester.Initialize: boolean;
    begin
      Task.RegisterComm(ctComm);
      Result := true;
    end;
    

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2014-06-11
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多