2014-02-23 31 views
4

据我所知,调用TThread的Synchronize将执行同步代码,就好像它在主线程中运行一样。比方说,我在主线程中,我有一个按钮:TThread的同步行为

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过程的工作原理。

谢谢。

回答

5

不是一个愚蠢的问题。

同步实际上是暂时切换到主线程,所以它不是'好像' - 代码是从字面上在主线程上运行的。如果主线程在调用Synchronize时执行某些操作,则Synchronize调用必须等待主线程闲置。同样,如果一个同步调用正在执行,则需要在主线程上发生的其他任何事情都必须等待同步调用完成。

因此,对于这种情况,在中途切换到别的东西时不会中断一个操作。

7

A Synchronize()将请求放入队列中,然后将消息发布到主消息队列以表示同步队列处于挂起状态。当主消息循环处理该消息时,然后执行Synchronize()代码。 Button1Click()也是由窗口消息触发的,因此主消息循环在Button1Click()正在运行时被阻止。如果在此期间调用Synchronize(),则在控制返回到主消息循环之前,同步的代码将不会执行。所以,要回答你的问题,将在Button1Click()完成并退出后执行。