Delphi中的跨线程通信

时间:2009-01-13 13:32:44

标签: multithreading delphi c++builder

Delphi中是否有关于跨线程通信的文档?如何将消息发送到没有窗口的线程?

3 个答案:

答案 0 :(得分:11)

您只能向实现标准消息循环的线程发送(Windows)消息,这将在实现窗口句柄后自动生成。

然而,没有必要使用消息与线程通信。让它等待事件对象(VCL中的TEvent),并在您希望线程执行函数时发出此事件的信号。

但是,如果您不熟悉多线程 - 请不要自己详细介绍所有这些细节,除非您想要学习效果。只需使用OmniThreadLibrary即可完成。一旦你知道如何使用它,就可以通过挖掘它的内部结构来学到很多东西。

修改

另见this question的答案非常相似。

编辑2:

关于评论“[OmniThreadLibrary]变得更容易,费用是多少?”我只能建议你自己检查一下 - 也就是你至少使用Delphi 2007.有几个例子来说明这些概念,但是对于一个快速的“真实”例子,你可以看一下{{ 3}} - 你甚至不需要为此安装库。

我也同意使用库进行多线程确实需要某种信仰行为。 OTOH使用VCL提供的功能几乎不可替代。示例代码仍然使用错误的Synchronize()调用。不支持线程安全的生产者 - 消费者队列,它更适合多线程编程。如果您确实认为您的多线程程序需要比VCL提供的更坚实的基础 - 为什么要重新发明特定的轮子?

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

如果您认为它毕竟不适合您 - 请自行编写代码。我对Delphi 4做了同样的事情,我已经使用该代码近10年了。从我发现的错误数量和我在那段时间遇到的角落情况来判断,我肯定会建议任何新手多线程到为它编写自己的库代码。如果您真的非常想要,请将this blog post中的规则铭记于心。

答案 1 :(得分:3)

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

答案 2 :(得分:-1)

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

或者,您可以使用中心控制对象,线程在不忙时通过该对象进行通信。我有一个应用程序,其中线程有特定的目的,并分配一个线程ID。任何线程都可以将带有消息ID和参数字符串的消息“发布”到另一个线程ID,然后继续其工作。另一个线程是在闲暇时选择它,并采取相应的行动。