首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在任务之间发送消息(OmniThreadLibrary)?

是否可以在任务之间发送消息(OmniThreadLibrary)?
EN

Stack Overflow用户
提问于 2011-01-13 22:41:08
回答 1查看 620关注 0票数 2

我的应用程序将有几个任务来执行各种操作。

所有任务都是在FormCreate中创建的,并在FormDestroy中终止,只要应用程序正在运行,它们就会一直运行。

主线程的唯一目的是处理用户I/O,并将用户输入发送到适当的任务,或者接收要在主窗体中显示的任务信息。

将会有必须在任务之间传输的数据。

示例:

我将让任务A进行数据处理。

它会将部分结果发送到主线程进行显示。

它还必须向任务B发送一些(其他)数据,任务B会将数据传输到另一台PC。

任务C将从硬件设备接收一些数据,并必须将这些数据发送到任务A进行处理。

等等。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-13 23:20:42

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

有关示例,请参阅演示08_RegisterComm。

代码语言:javascript
复制
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;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4681254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档