gpt4 book ai didi

multithreading - 将数据从线程发送到主 VCL 线程

转载 作者:行者123 更新时间:2023-12-03 18:13:57 25 4
gpt4 key购买 nike

我正在编写一些通过 dll 与外部硬件通信的软件(移动一些电机并读回一些值)。对 dll 的调用被阻塞,并且可能不会在 10 秒内返回。该软件通过移动硬件、读取并重复多个点来执行扫描。一次扫描可能需要大约 30 分钟才能完成。在扫描运行时,我显然希望 GUI 能够响应,并且在每个点更新传入数据的实时图表(在 MDI 子项中)。多线程似乎是解决这个问题的明显选择。

我的问题是,在扫描期间线程化并与主 VCL 线程对话以更新图形的最佳方法是什么?

我目前在 ChildForm 的公共(public) var 部分中有一个执行“扫描逻辑”的 TThread 后代和一个 double 组。我需要从线程中填写这个数组,但我不知道是否使用 Synchronize 或 CriticalSection 或 PostMessage 或其他方法。每次添加新值时,主 VCL 线程都需要更新图形。我真的应该为作为全局变量的数据提供一个中间对象,并以某种方式分别从 Thread 和 ChildForm 访问它吗?

最佳答案

从线程更新 GUI 的最简单方法是使用 anonymous methods结合 TThread.SynchronizeTThread.Queue .

procedure TMyThread.Execute;
begin
...
Synchronize( // Synchronous example
procedure
begin
// Your code executed in main thread here
end
);
...
Queue( // Asynchronous example
procedure
begin
// Your code executed in main thread here
end
);
end;

异步传递值通常需要“捕获”一个值。

procedure TMyThread.PassAValue(anInteger: Integer);
begin
Queue(
procedure
begin
// Use anInteger in main thread
end
);
end;

procedure TMyThread.Execute;
var
myInt: Integer;
begin
...
PassAValue(myInt); // Capture myInt
...
end;

当匿名方法使用变量时,会捕获对变量的引用。这意味着如果您在执行匿名方法之前更改变量值,则会使用新值。因此需要捕捉“值(value)”。

可以在此处找到更详细的示例,synchronize-and-queue-with-parameters , 由 @UweRaabe .

关于multithreading - 将数据从线程发送到主 VCL 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114353/

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