Delphi中的跨线程通信

7
有没有有关Delphi跨线程通信的文档?我如何向没有窗口的线程发送消息?
3个回答

11
只有实现了标准消息循环的线程(在窗口句柄被实现后将自动创建)才能发送(Windows)消息。
然而,与线程通信并不必须使用消息。只需让它等待事件对象(在VCL中为TEvent),并在您想要线程执行函数时发出此事件的信号即可。
但是,如果您是多线程的新手,请勿单独处理所有这些细节,除非您想要学习效果。只需使用OmniThreadLibrary即可完成。一旦您知道如何使用它,就可以深入研究其内部并学到更多好东西。
请注意答案中提供的内容:此问题的答案也非常相似。
关于评论中询问“[OmniThreadLibrary]使什么变得更容易,代价是什么?” 我只能建议您自己尝试一下-如果您至少使用Delphi 2007。有几个示例可说明概念,但是对于一个快速的“现实生活”示例,您可以查看此博客文章 -您甚至不需要安装该库。
我也同意使用多线程库确实需要一定的信任。另一方面,只使用VCL提供的功能并不是一个好选择。示例代码仍然使用不合理的Synchronize()调用。没有支持像线程安全的生产者-消费者队列这样更适合多线程编程的事情。如果您确实认为需要比VCL提供的更坚实的基础来支持多线程程序-为什么要重新发明那个特定的轮子呢?

关于使用库的成本:您需要自己考虑是否足够快速。在我看来,它确实以良好的方式抽象了线程之间的通信,但是每个抽象显然都会牺牲性能。

如果您最终决定不使用该库 - 请自己编写代码。我曾经为 Delphi 4 做过同样的事情,并且我已经使用那段代码将近10年了。根据我在这段时间里发现的数量和经历的角落案例的数量,我一定会建议任何新手不要为此编写自己的库代码。如果您真的非常想要,那么请认真遵守这篇文章中的规则。


我和 OP 处于相同的情况。我知道得太少,无法确定 OmniThreadLibrary 对我的帮助除了“让它更容易”之外还有什么。它究竟使什么更容易,代价是什么?此外还有“泄漏的抽象问题” - 如果出现任何问题,该库会阻碍解决问题的视野。 - Marek Jedliński
OTL与VCL做的事情类似 - 它会为您隐藏直接使用线程的固有丑陋性。它还将允许您尽可能直接地使用底层Windows原语(同样如VCL)。有关更多信息,请访问http://otl.17slon.com/forum。 - gabr
RE Edit 2:这正是为什么我写它的原因。我也从 D4 时代开始编写多线程代码,去年我正在使用我的第三代封装器并对其不满意。因此,我基于以前的经验编写了一个新库。希望这一次我终于做对了 :) - gabr

3

-1

如果您有线程对象的引用,可以直接调用它,并相应地存储信息或更新。显然,您必须小心以线程安全的方式执行操作。

或者,您可以使用一个中央控制对象,在线程不忙时进行通信。我有一个应用程序,其中线程具有特定的目的,并分配了线程ID。任何线程都可以向另一个线程ID发布带有消息ID和参数字符串的消息,然后继续工作。其他线程在空闲时会接收到该消息并相应地处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接