Multithreading Delphi中的跨线程通信

Multithreading Delphi中的跨线程通信,multithreading,delphi,c++builder,Multithreading,Delphi,C++builder,Delphi中有关于跨线程通信的文档吗?如何向没有窗口的线程发送消息?您只能向实现标准消息循环的线程发送(Windows)消息,一旦实现了窗口句柄,将自动创建标准消息循环 但是,没有必要使用消息与线程通信。只要让它等待一个事件对象(VCL中的TEvent),并在您希望线程执行某个函数时发出此事件的信号 但是,如果您是多线程新手,请不要单独讨论所有这些细节,除非您希望获得学习效果。只要使用这个工具就可以了。一旦你知道如何使用它,通过挖掘它的内部,你会学到很多东西 编辑: 另请参见非常相似的答案 编

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

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

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

但是,如果您是多线程新手,请不要单独讨论所有这些细节,除非您希望获得学习效果。只要使用这个工具就可以了。一旦你知道如何使用它,通过挖掘它的内部,你会学到很多东西

编辑:

另请参见非常相似的答案

编辑2:

关于“OmniThreadLibrary让什么变得更容易,成本是多少?”的评论,我只能建议您自己检查一下——如果您使用的至少是Delphi 2007。有几个示例可以说明这些概念,但是对于一个快速的“现实生活”示例,您可以看一下-您甚至不需要为此安装库

我也同意将库用于多线程确实需要一定的信念。奥托利用VCL提供的服务几乎不是替代方案。示例代码仍然使用构思不周的Synchronize()调用。它不支持线程安全生产者消费者队列之类的东西,后者更适合多线程编程。如果你同意你的多线程程序需要一个比VCL提供的更坚实的基础,为什么要重新发明这个特殊的轮子呢

至于使用图书馆的费用:你必须自己计时,看它是否足够快。它确实以一种很好的方式抽象了线程之间的通信,但显然,每个抽象都会牺牲性能


如果你最终决定它不适合你,那就自己编写代码。我对Delphi4也做了同样的操作,我已经使用该代码近10年了。根据我发现的bug数量和我在那段时间内遇到的各种情况判断,我肯定会建议任何新接触多线程的人不要为多线程编写自己的库代码。如果你真的想,请牢记这些规则。

这个问题还包含一些线程间通信的示例

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


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

我的处境与OP相同。除了“让它更容易”之外,我知道的太少,不知道OmniThreadLibrary为我做了什么。它让什么变得更容易,代价是什么?另外还有“泄漏的抽象”问题——如果出现任何错误,lib将阻碍对问题的理解。OTL做了一些与VCL类似的事情——它隐藏了直接使用线程的固有丑陋性。它还允许您尽可能直接使用底层Windows原语(与VCL相同)。重新编辑2:这正是我写这篇文章的原因。我也开始在D4时代编写多线程代码,去年我使用了我的第三代包装器,对此很不满意。所以我根据以前的经验写了一个新的图书馆。我希望这一次我终于做对了:)