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

有帮助吗?

解决方案

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

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

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

编辑:

另请参阅以下问题的答案 这个问题 这非常相似。

编辑2:

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

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

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

如果您认为它毕竟不适合您 - 自己编写代码。我对 Delphi 4 做了同样的事情,并且我已经使用该代码近 10 年了。从我发现的错误数量和当时经历的极端情况来看,我绝对会建议任何刚接触多线程的人 不是 为其编写自己的库代码。如果你 真的真的 想要的话,请遵守规则 这个帖子 铭记于心。

其他提示

在问题 Delphi的多线程消息循环还包含几个例子线程之间的通信的

如果你有线程对象的引用,你可以调用它直接,有程序存储信息或进行相应更新。很明显,你必须要小心做事在一个线程安全的方式。

可替换地,可以使用通过它的时候都没有忙线程进行通信的中央控制对象。我有一个应用程序,其中线程具有特定的目的,并分配一个线程ID。任何线程都可以“后”与消息ID和参数字符串到另一个线程ID,然后消息得到其工作。其他线程中的选了在其休闲,和相应的行为

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top