gpt4 book ai didi

multithreading - 在主线程和子线程之间使用 TThread 的 "Synchronize"还是使用 IPC 的窗口消息更好?

转载 作者:行者123 更新时间:2023-12-03 14:34:16 24 4
gpt4 key购买 nike

我有一个用 Delphi 2007 编写的相当简单的多线程 VCL gui 应用程序。我在多个子线程(最多 16 个并发)中进行了一些处理,这些子线程需要更新我的主窗体上的网格控件(只需将字符串发布到网格)。没有一个子线程相互交谈。

我最初的设计涉及调用 TThread's "Synchronize"在当前运行的线程中更新网格控件表单。但是,我知道调用 Synchronize 本质上就像调用时的主线程一样执行。一次运行多达 16 个线程(大多数子线程的处理时间从 < 1 秒到 ~10 秒),Window Messages 会是更好的设计吗?

我已经让它在这一点上工作,其中子线程发布一条 Windows 消息(由几个字符串的记录组成),而主线程有一个监听器,并在收到消息时简单地更新网格。

在这种情况下对 IPC 的最佳方法有何看法?窗口消息或“同步”?

如果我使用窗口消息,您是否建议将我发布到网格的代码包装在 TCriticalSection(进入和离开) block 中?或者我不需要担心线程安全,因为我正在主线程中写入网格(尽管在窗口消息处理程序的函数中)?

最佳答案

顺便说一句,您也可以使用 TThread.Queue() 而不是 TThread.Synchronize() . Queue()是异步版本,它不会阻塞调用线程:

(Queue 从 D8 开始可用)。

我更喜欢 Synchronize()Queue() ,因为它比普通消息发送更容易理解(对于其他程序员)和更好的 OO(无法控制它或能够调试它!)

关于multithreading - 在主线程和子线程之间使用 TThread 的 "Synchronize"还是使用 IPC 的窗口消息更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com