在 Delphi 中使用线程进行消息队列

Message queueing with threads in Delphi

提问人:snowdev 提问时间:11/2/2023 最后编辑:Andreas Rejbrandsnowdev 更新时间:11/2/2023 访问量:145

问:

我是消息队列的新手,想要实现如下内容:

  • 从主线程获取信息

  • 发送到工作线程队列

  • 工作线程可能只是处理它或发送到另一个工作线程处理它

  • 由于某些事件,最终回调执行到 UI(可以使用同步机制处理它)

我的主要问题是如何在主线程和工作线程之间以及工作线程与其他工作线程之间进行通信(为了最终向主线程发出信号,我可以回调然后同步)。

经过大量的谷歌搜索,我基本上找到了两种方法:

  • 创建一个 message-only ,用于在已注册的函数之间交换消息。我在这里找到了一个完美的例子。正如 Remy Lebeau 所评论的那样,这种方式可能需要通过以下方式发送消息(而且似乎是更冗长的方式)。这样基本上我就使用函数并处理函数中的消息。HWNDWndProc()DispatchMessage()PostMessage()WndProc()

艺术

  • 使用 |循环,用于处理线程消息并处理其方法中需要执行的操作。这个基本上我在线程的方法中使用函数和处理消息;TThreadPeekMessage()GetMessage()Execute()PostThreadMessage()Execute()

我成功地测试了两个选项的基本演示,以我提到的两种方式接收消息。

对于那些拥有更多专业知识的人来说,我走在正确的轨道上吗?我是否错过了试图理解如何做到这一点的东西?

对于那些更有经验的人来说,另一个问题是,哪种方法最适合繁重的消息交换?哪个最适合 X 情况或 Y 情况?

这是一个更理论化的问题,但感谢那些可以提供帮助的人。

多线程 Delphi 消息队列 PostMessage 速览消息

评论

0赞 Martin James 11/2/2023
通信 TO 线程的 Windows 消息队列的一个问题是只有一个线程(队列创建者/所有者)?可以等待。我通常使用带有操作系统信号量(CreateSemaphore 等 API)的 TObjectQueue deendant 来计算/等待条目。PostMessage() 可用于将对象发送回 GUI 线程,因此可以避免 synchronize() 调用:)
3赞 David Heffernan 11/2/2023
为什么不使用线程库?
0赞 fpiette 11/2/2023
我基本上使用您在最后一个备选方案中描述的内容。线程有一个消息循环,即创建一个仅用于消息传递的 HWND。线程的 Execute 消息泵消息来自该 HWND。我将 WinAPI 用于所有与消息相关的内容,以便它是线程安全的。我从不使用 PostThreadMessage,总是使用 PostMessage。当必须交换大量数据时(单个消息只有 WParam 和 LParam 作为数据字段),发送方分配内存,接收方释放内存。消息本身仅携带数据指针。
0赞 snowdev 11/3/2023
@fpiette 对不起,但我不明白相关。我的第一个选择就是您在这里建议的:线程创建一个隐藏的仅消息窗口,其中包含关联的 WndProc 并处理通过该窗口接收的消息。我的第二种选择是直接在该进程中无限循环,通过 .PostMessage()PeekMessage()|GetMessage()Execute()PostThreadMessage()
0赞 snowdev 11/3/2023
仅分析代码及其在我列出的两个选项中的作用(我认为这是在 Delphi 顺便说一句中处理队列和处理消息的唯一两种方法),我认为第二种更快,但正如我之前所说,我对消息队列的东西很陌生。

答: 暂无答案