TThread.Synchronize()如何工作?

pau*_*aul 0 delphi c++builder

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

while(true) {}
CreateDirectory ("D:\\test", NULL);
Run Code Online (Sandbox Code Playgroud)

发生了什么是UI冻结,并且没有创建文件夹.这是否意味着Synchronize()将代码传递给UI线程来执行它,然后等待代码执行后再继续?


编辑:

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

我打电话Synchronize()给以下代码:

while(true) {}
Run Code Online (Sandbox Code Playgroud)

在打电话之后Synchronize(),我有以下代码:

CreateDirectory ("D:\\test", NULL);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

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

是.事实上,这在文档中有所描述:

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

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

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

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

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

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

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