Delphi 中是否有关于跨线程通信的文档?如何向没有窗口的线程发送消息?
3 回答
您只能将(Windows)消息发送到实现标准消息循环的线程,一旦实现窗口句柄,它将自动创建。
然而,不必使用消息与线程通信。只需让它等待一个事件对象(VCL 中的 TEvent),并在您希望线程执行某个功能时发出此事件信号。
但是,如果您不熟悉多线程 - 不要自己深入所有这些细节,除非您想获得学习效果。只需使用OmniThreadLibrary并完成它。一旦你知道如何使用它,就可以通过深入研究它的内部来学习很多东西。
编辑:
另请参阅非常相似的这个问题的答案。
编辑2:
关于询问“[OmniThreadLibrary] 使什么变得更容易,成本是多少?”的评论。我只能建议您自己检查一下 - 也就是说,如果您至少使用 Delphi 2007。有几个示例可以说明这些概念,但是对于一个快速的“现实生活”示例,您可以查看此博客发布- 您甚至不需要为此安装库。
我也同意将库用于多线程确实需要某种信念。OTOH 使用 VCL 提供的东西几乎不是替代方案。示例代码仍然使用构思不当的 Synchronize() 调用。不支持线程安全的生产者-消费者队列之类的东西,它们更适合多线程编程。如果你同意你的多线程程序需要比 VCL 提供的更坚实的基础 - 为什么要重新发明那个特定的轮子?
至于使用图书馆的费用:你必须自己计时它是否对你来说足够快。恕我直言,它确实以一种很好的方式抽象了线程之间的通信,但显然,每个抽象都会牺牲性能。
如果您认为它毕竟不适合您 - 自己编写代码。我对 Delphi 4 做了同样的事情,而且我已经使用该代码近 10 年了。从我发现的错误数量和我在那段时间经历的极端情况来看,我绝对会建议任何刚接触多线程的人不要为它编写自己的库代码。如果您真的想这样做,请牢记此帖子中的规则。
Delphi Multi-Threading Message Loop这个问题也包含了几个线程间通信的例子
如果您有对线程对象的引用,您可以直接调用它,并让过程存储信息或相应地更新。显然,您必须小心以线程安全的方式做事。
或者,您可以使用一个中央控制对象,线程不忙时通过该对象进行通信。我有一个应用程序,其中线程具有特定用途,并被分配了一个线程 ID。任何线程都可以将带有消息 ID 和参数字符串的消息“发布”到另一个线程 ID,然后继续其工作。另一个线程在闲暇时将其拾起,并采取相应的行动。