根据我的理解,调用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会调用同步(ChangeButton1); 我们可以知道吗当ChangeButton1将由主线程运行时?如果是这样,是否会在整个 Button1Click 执行之后;或者它可以是程序中的四个操作中的任何一个吗?
对不起,如果这是一个愚蠢的问题。我一直无法找到这个问题的答案。这将使我更好地了解Synchronize过程的工作原理。
感谢。
答案 0 :(得分:7)
将Synchronize()
请求放入队列,然后将消息发布到主消息队列,以指示Synchronize队列处于挂起状态。当主消息循环处理该消息时,然后执行Synchronize()
代码。 Button1Click()
也由窗口消息触发,因此在Button1Click()
运行时阻止主消息循环。如果在此期间调用Synchronize()
,则在将控件返回到主消息循环之前,不会执行同步代码。因此,要回答您的问题,ChangeButton1()
将在Button1Click()
完成并退出后执行。
答案 1 :(得分:5)
不是一个愚蠢的问题。
Synchronize实际上暂时切换到主线程,所以它不是“好像” - 代码实际上是在主线程上运行的。如果在调用Synchronize时主线程正在执行某些操作,则Synchronize调用必须等待主线程进入空闲状态。同样,如果正在执行同步调用,则需要在主线程上发生的任何其他操作必须等待同步调用完成。
因此,对于这种情况,中途没有中断一个操作来切换到其他内容。