首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi中的跨线程通信

Delphi中的跨线程通信
EN

Stack Overflow用户
提问于 2009-01-13 13:32:44
回答 3查看 5.4K关注 0票数 6

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-13 13:54:02

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

但是,没有必要使用消息与线程进行通信。只要让它等待一个事件对象(在VCL中是TEvent),并在你想让线程执行一个函数时通知这个事件。

但是,如果你是多线程的新手--不要自己研究这些细节,除非你想学习效果。只需使用OmniThreadLibrary并完成它。一旦你知道如何使用它,通过深入研究它的内部结构,你会学到很多好东西。

编辑:

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

编辑2:

关于“OmniThreadLibrary让什么变得更简单,代价是什么?”我只能建议你自己去检查一下--如果你至少在使用Delphi2007的话。有几个示例可以说明这些概念,但对于一个快速的“现实生活”示例,您可以看看this blog post -您甚至不需要为此安装库。

我也同意将库用于多线程确实需要一定的信念。OTOH用VCL提供的东西凑合着使用几乎不是一种选择。示例代码仍然使用了构思错误的Synchronize()调用。不支持线程安全的生产者-消费者-队列之类的东西,它们更适合于多线程编程。如果您确实同意您的多线程程序需要比VCL提供的更坚实的基础-为什么要重新发明那个特殊的轮子呢?

至于使用库的成本:你必须自己计时,看看它对你来说是否足够快。它确实以一种很好的方式抽象了线程之间的通信,但显然,每一个抽象都会以性能为代价。

如果你觉得它终究不适合你,那就自己写代码吧。我在Delphi 4上也做了同样的事情,我已经使用这个代码将近10年了。根据我在那段时间发现的大量错误和遇到的小问题,我绝对建议任何刚接触多线程的人使用而不是编写自己的库代码。如果你真的真的想,请把this posting中的规则放在心上。

票数 11
EN

Stack Overflow用户

发布于 2009-01-13 13:57:36

问题Delphi Multi-Threading Message Loop还包含一些线程间通信的示例

票数 3
EN

Stack Overflow用户

发布于 2009-01-13 16:44:03

如果您有一个对线程对象的引用,您可以直接调用它,并让过程存储信息或相应地更新。显然,你必须小心以线程安全的方式做事情。

或者,您可以使用中央控制对象,线程在空闲时通过该对象进行通信。我有一个应用程序,其中线程有特定的用途,并分配了一个线程ID。任何线程都可以将带有消息ID和参数字符串的消息"post“到另一个线程ID,然后继续它的工作。另一个线程在空闲时拾取它,并相应地执行操作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/438945

复制
相关文章

相似问题

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