2

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

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

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

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

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

4

1 回答 1

6

可能的。您必须在所有者中创建一个通信通道并将其传递给这两个任务。然后在任务中调用 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;
于 2011-01-13T15:20:41.623 回答