TThread.Synchronize()如何工作?

时间:2015-04-16 21:45:48

标签: delphi c++builder

我使用C ++ Builder 2010中的Synchronize()方法测试了以下代码:

while(true) {}
CreateDirectory ("D:\\test", NULL);

发生的事情是UI已冻结,并且未创建文件夹。这是否意味着Synchronize()将代码传递给UI线程来执行它,然后在继续之前等待代码执行?


修改

我错误地解释了我在测试代码中所做的事情。我真正做的是以下几点:

我使用以下代码调用了Synchronize()

while(true) {}

在致电Synchronize()后,我有以下代码:

CreateDirectory ("D:\\test", NULL);

1 个答案:

答案 0 :(得分:5)

  

这是否意味着Synchronize()将代码传递给UI线程来执行它,然后在继续之前等待代码执行?

是。事实上,这是在documentation

中描述的
  

在主线程中执行方法调用。

     

Synchronize导致使用AMethod指定的调用   主线程,从而避免多线程冲突。 AThread   参数关联调用者线程。

     

对于静态方法,您可以将AMethod与任何使用的线程相关联   AThread参数。此外,您可以使用nil / NULL作为AThread参数   如果您不需要知道调用者线程的信息   主线。

     

在当前实现中,Synchronize方法可以使用   关联线程信息以唤醒Windows上的主线程   平台。

     

如果您不确定方法调用是否是线程安全的,请从中调用它   在Synchronize方法中,以确保它在main中执行   线程。

     

当方法执行时,暂停执行当前线程   在主线程中。

因此,无限循环阻塞了主线程。确实是工人的话题。