multithreading - Delphi中的跨线程通信

标签 multithreading delphi c++builder

Delphi中有关于跨线程通信的文档吗?如何向没有窗口的线程发送消息?

最佳答案

您只能将(Windows)消息发送到实现标准消息循环的线程,一旦实现窗口句柄,该消息循环将自动创建。

但是,没有必要使用消息来与线程通信。只需让它等待一个事件对象(VCL 中的 TEvent),并在您希望线程执行某个功能时发出该事件信号即可。

但是,如果您是多线程新手,请不要自己深入了解所有这些细节,除非您想达到学习效果。只需使用 OmniThreadLibrary 即可完成。一旦您知道如何使用它,通过深入研究它的内部结构,可以学到很多东西。

编辑:

另请参阅 this question 的答案,它非常相似。

编辑2:

关于询问“[OmniThreadLibrary] 使什么变得更容易,以及成本如何?”的评论我只能建议您亲自检查一下 - 也就是说,如果您至少使用 Delphi 2007。有几个示例可以说明这些概念,但对于快速的“现实生活”示例,您可以查看 this blog post -您甚至不需要为此安装库。

我也同意使用多线程库确实需要一定的信念。 OTOH 凑合使用 VCL 提供的功能并不是一个替代方案。示例代码仍然使用了考虑不周的 Synchronize() 调用。不支持线程安全的生产者-消费者-队列等更适合多线程编程的东西。如果您确实同意您的多线程程序需要比 VCL 提供的更坚实的基础 - 为什么要重新发明那个特定的轮子呢?

至于使用该库的成本:您必须自己衡量它是否足够快。恕我直言,它确实以一种很好的方式抽象了线程之间的通信,但显然,每种抽象都会降低性能。

如果您认为它根本不适合您 - 自己编写代码。我对 Delphi 4 做了同样的事情,并且我已经使用该代码近 10 年了。从我发现的错误数量和当时经历的极端情况来看,我绝对建议任何刚接触多线程的人不要为其编写自己的库代码。如果您真的愿意,请牢记 this posting 中的规则。

关于multithreading - Delphi中的跨线程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/438945/

相关文章:

Python线程-阻塞操作-终止执行

Python:在与数据库相关的任务中我应该使用多进程或多线程吗?

C# Threading.Suspend 已过时,线程已被弃用?

delphi - Delphi 字符串比较函数有什么区别?

c++ - 无法将辅助表单显示为MainForm

c++ - 创建我的 .exe 的批处理版本,它采用命令行参数(BCB 4.0 中的 ParamCount()、ParamStr() 和 FindCmdLineSwitch)

multithreading - delphi xe下服务应用程序中的线程不起作用

delphi - E2251 对 'TextToFloat' 的不明确重载调用

windows - 通过 WinAPI 和 Delphi 在 Skype 客户端中查找和使用当前事件的聊天框?

delphi - 如何使用诸如乘法之类的混合模式来填充矩形,而不仅仅是简单的透明度