TThread的同步行为

时间:2014-02-23 23:37:30

标签: delphi synchronize

根据我的理解,调用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过程的工作原理。

感谢。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

不是一个愚蠢的问题。

Synchronize实际上暂时切换到主线程,所以它不是“好像” - 代码实际上是在主线程上运行的。如果在调用Synchronize时主线程正在执行某些操作,则Synchronize调用必须等待主线程进入空闲状态。同样,如果正在执行同步调用,则需要在主线程上发生的任何其他操作必须等待同步调用完成。

因此,对于这种情况,中途没有中断一个操作来切换到其他内容。