如何在Delphi中从主线程发送消息到TThread?

9

我想向一个线程发送消息并在该线程中处理它。在Delphi中我该怎么做?我猜测PostMessage是可行的方法,但我看到的例子都是描述从线程到主线程的方式。

3个回答

6

我不会试图解释或编写任何代码。只需查看此教程。它有点老,但在我看来非常好。 多线程 - Delphi方式


谢谢。即使是CodeGear自己的网站也链接到了错误(以前的)地址。 - delphist
感谢提供教程链接。 - samir105
我想我刚在http://cc.embarcadero.com/item/14809和http://thaddy.co.uk/threads/找到了它。哪个具体部分谈论了消息? - EMBarbosa
虽然找到了链接,但缺少图像。 - Jerry Dodge

6
您可以在线程中使用消息循环(可能带有隐藏的通知窗口)并向其发送Windows消息,或者您可以使用一种更本地化(非GUI)的方式来实现,例如由关键部分保护的队列与手动重置事件组合,线程等待并发送线程信号。
更一般的解决方案是生产者-消费者队列,在经典实现中使用了几个信号量来跟踪消费者和生产者以及第三个信号量用于互斥访问队列;但是,更优化的生产者-消费者队列可以在网络上找到。

4
记住,孩子们:如果你的目标是性能,请不要使用 .Synchronize()。 - F.D.Castel
完全同意。如果那是一个答案而不是评论,我会投赞成票的。关于TThread的一些dos和donts的不错小抱怨,请参见http://newsgroups.cryer.info/borland/public.delphi.internet.winsock/200507/0507273541.html - mghie

3
为什么需要这样做呢?我曾经不得不在辅助线程中创建消息循环的唯一原因是该线程使用了COM对象。对 OleInitialize()OleUnitialize() 的调用表明您需要一个标准的 GetMessage() 循环。在这种情况下,还需要使用 PostThreadMessage() 向该线程发送消息,因为普通的阻塞同步调用会干扰消息循环。否则,请不要这样做。
如果您使用的是 Delphi 2007 或 2009,请务必查看 Primož Gabrijelčič 的 OmniThreadLibrary,它应该能让您的工作变得更加容易。

为什么需要这样做呢?例如,我有一个线程每1000毫秒从服务器轮询事件,但我需要将轮询速率更改为5000毫秒。为此停止然后重新启动线程太麻烦了。 - john_who_is_doe
@tdiop:要实现这个,不需要向线程发送任何消息,还有许多其他更好的方法可以做到。查看其他答案以获取灵感。 - mghie

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