gpt4 book ai didi

delphi - TThread 的同步行为

转载 作者:行者123 更新时间:2023-12-03 15:18:23 24 4
gpt4 key购买 nike

据我了解,调用TThread的Synchronize将执行同步代码,就像在主线程中运行一样。假设在我的主线程中,我有一个按钮:

procedure TForm3.Button1Click(Sender: TObject);
var
A, B, C : String;
begin
A := 'test1';
B := 'test2';
C := 'test3';
Button1.Enabled := false;
end;

在辅助线程中,我有以下代码:

procedure TestThread.ChangeButton1;
begin
Form3.Button1.Enabled := true;
end;

(不要关注代码本身 - 它只是一个示例,应该意味着任何东西。)

假设我点击 Button1,紧接着,当 Button1Click 正在执行时,TestThread 调用 Synchronize(ChangeButton1); 我们可以知道主线程何时运行 ChangeButton1?如果是的话,是否是在整个Button1Click执行完毕之后?或者它可以是程序内四个操作中的任何一个?

抱歉,如果这是一个愚蠢的问题。我一直无法找到这个问题的答案。它将使我更好地理解同步过程是如何工作的。

谢谢。

最佳答案

Synchronize() 请求被放入队列中,然后一条消息被发布到主消息队列以表明 Synchronize 队列正在挂起。当主消息循环处理该消息时,将执行 Synchronize() 代码。 Button1Click() 也是由窗口消息触发的,因此当 Button1Click() 运行时,主消息循环被阻塞。如果在此期间调用 Synchronize(),则同步代码将不会执行,直到控制返回到主消息循环。因此,为了回答您的问题,ChangeButton1() 将在 Button1Click() 完成并退出后执行。

关于delphi - TThread 的同步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976273/

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