我使用C ++ Builder 2010中的Synchronize()
方法测试了以下代码:
while(true) {}
CreateDirectory ("D:\\test", NULL);
发生的事情是UI已冻结,并且未创建文件夹。这是否意味着Synchronize()
将代码传递给UI线程来执行它,然后在继续之前等待代码执行?
修改
我错误地解释了我在测试代码中所做的事情。我真正做的是以下几点:
我使用以下代码调用了Synchronize()
:
while(true) {}
在致电Synchronize()
后,我有以下代码:
CreateDirectory ("D:\\test", NULL);
答案 0 :(得分:5)
这是否意味着Synchronize()将代码传递给UI线程来执行它,然后在继续之前等待代码执行?
是。事实上,这是在documentation:
中描述的在主线程中执行方法调用。
Synchronize导致使用AMethod指定的调用 主线程,从而避免多线程冲突。 AThread 参数关联调用者线程。
对于静态方法,您可以将AMethod与任何使用的线程相关联 AThread参数。此外,您可以使用nil / NULL作为AThread参数 如果您不需要知道调用者线程的信息 主线。
在当前实现中,Synchronize方法可以使用 关联线程信息以唤醒Windows上的主线程 平台。
如果您不确定方法调用是否是线程安全的,请从中调用它 在Synchronize方法中,以确保它在main中执行 线程。
当方法执行时,暂停执行当前线程 在主线程中。
因此,无限循环阻塞了主线程。确实是工人的话题。