我正在编写一个软件,通过dll与外部硬件通信(移动一些电机并返回一些值)。对dll的调用是阻塞的,可能需要10秒左右才能返回。该软件通过移动硬件、进行读数并重复执行若干次来执行扫描。每次扫描可能需要30分钟左右才能完成。在扫描过程中,我显然希望GUI具有响应性,并且在每个点处更新即时图形(在MDI子窗口中)。多线程似乎是这个问题的明显选择。
我的问题是,最佳的线程方式和如何回话到主VCL线程以在扫描期间更新图形?
我目前有一个单个TThread派生类,它执行“扫描逻辑”和ChildForm中公共var部分的双精度数组。我需要从线程中填充此数组,但我不知道是使用Synchronize还是使用CriticalSection或PostMessage或其他某种方法。每当添加新值时,主VCL线程都需要更新图形。我真的应该为数据创建一个全局var的中介对象,并从线程和ChildForm分别访问吗?
我的问题是,最佳的线程方式和如何回话到主VCL线程以在扫描期间更新图形?
我目前有一个单个TThread派生类,它执行“扫描逻辑”和ChildForm中公共var部分的双精度数组。我需要从线程中填充此数组,但我不知道是使用Synchronize还是使用CriticalSection或PostMessage或其他某种方法。每当添加新值时,主VCL线程都需要更新图形。我真的应该为数据创建一个全局var的中介对象,并从线程和ChildForm分别访问吗?
Synchronize
会起作用,并且是最简单的选择。让主线程拥有数据,并让工作线程使用Synchronize
发送新数据以供主线程追加和显示。 - David HeffernanTThread.Synchronize
和TThread.Queue
,使代码更易于维护和阅读。我真的不喜欢 Ghigo 建议的非常低级的方法。 - David Heffernan