Postmessage和sendmessage的替代方案

时间:2011-09-30 22:10:28

标签: delphi

我有一个程序,它使用多个线程来执行某些任务。每个线程都有一堆任务要执行。在执行其中一个之后,每个thred都会将一条帖子消息调到主屏幕以更新日志。

现在我有六万个任务,每个线程一万个 - 六个线程 - 在执行每个任务线程后调用post消息。但由于这些帖子消息,我的应用程序变得非常繁忙,看起来像是被绞死了。

如果我删除帖子消息......一切正常。但是我无法直接调用该过程,因为它使用ui控件而ui控件不是线程安全的,直接从线程调用过程会导致其他错误。

所以还有替代邮件和发送消息的替代方案。

谢谢, 罗勒

5 个答案:

答案 0 :(得分:22)

答案 1 :(得分:4)

你很难找到比PostMessage更好的东西。我的猜测是你的问题是你过于频繁地更新UI而你的队列正在变得饱和,因为你无法足够快地提供服务。如果你在不到一秒前更新了,那么如何跳过更新呢?如果能够恢复响应能力,那么您可以考虑采用更强大的解决方案。

答案 2 :(得分:1)

您可以将消息放入线程安全队列中,而不是发布消息。

在主线程中,使用计时器事件来排空队列。

要保持敏感,请不要在计时器事件中停留太长时间。

在很多情况下,我发现这比发帖更好。

在Delphi XE中有一个名为TThreadedQueue的类,您可以使用它。

修改:

我使用不同的线程向GUI技术上传了一个示例排序应用程序。

请参阅ThreadedQueueDemo

答案 3 :(得分:1)

我已多次这样做了。让来自线程的已发布消息更新主窗体上的“缓存”。在主窗体上有一个计时器(如果需要,设置为大约100毫秒或更短)从缓存中更新主窗体。这样,每个发布消息的工作量非常小,因此应用程序将花费更少的时间处理,您的应用程序将显示为“响应”。

答案 4 :(得分:0)

您可以创建一个用于更新日志的新线程,并在日志线程中调用TLogThread.Synchronize来更新主应用程序线程中的UI控件...或者只需调用TWorkerThread.Synchronize来更新工作线程中的日志