All*_*ain 4 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;
Run Code Online (Sandbox Code Playgroud)
在辅助线程中,我有以下代码:
procedure TestThread.ChangeButton1;
begin
Form3.Button1.Enabled := true;
end;
Run Code Online (Sandbox Code Playgroud)
(不要注意代码本身 - 它只是一个例子而且它不应该意味着什么.)
假设我单击Button1,然后在执行Button1Click时,TestThread调用Synchronize(ChangeButton1); 我们可以知道什么时候主线程会运行ChangeButton1吗?如果是这样,它是否会在整个Button1Click被执行之后出现; 或者它可以是程序内的四个操作中的任何一个?
对不起,如果这是一个愚蠢的问题.我一直无法找到这个问题的答案.这将使我更好地了解Synchronize过程的工作原理.
谢谢.
将Synchronize()
请求放入队列,然后将消息发布到主消息队列,以指示Synchronize队列处于挂起状态.当主消息循环处理该消息时,Synchronize()
然后执行代码. Button1Click()
也是由窗口消息触发,因此主消息循环在Button1Click()
运行时被阻止.如果Synchronize()
在此期间调用,则在将控制返回到主消息循环之前,将不会执行同步代码.所以,回答你的问题,ChangeButton1()
将在Button1Click()
完成并退出后执行.
不是一个愚蠢的问题.
Synchronize实际上暂时切换到主线程,所以它不是"好像" - 代码实际上是在主线程上运行的.如果在调用Synchronize时主线程正在执行某些操作,则Synchronize调用必须等待主线程进入空闲状态.同样,如果正在执行同步调用,则需要在主线程上发生的任何其他操作必须等待同步调用完成.
因此,对于这种情况,中途没有中断一个操作来切换到其他操作.
归档时间: |
|
查看次数: |
626 次 |
最近记录: |