我们经常在做程序开发的时候会使用到线程,但是线程如果需要操作UI界面元素,则需要使用到Queue和Synchronize方法,这两个方法都会安全的在主线程中执行任务,但是她们的区别是什么呢?
详细看下官方的解释就清楚了:
一、Synchronize 说明:
在主线程中执行方法调用。
同步会使 AMethod 指定的调用在主线程中执行,从而避免多线程冲突。AThread 参数关联调用者线程。
对于静态方法,可以使用 AThread 参数将 AMethod 与任何线程关联。此外,如果不需要知道主线程中调用线程的信息,也可以使用 nil/NULL 作为 AThread 参数。
在当前实现中,同步方法可以使用关联线程信息来唤醒 Windows 平台上的主线程。
如果不确定方法调用是否线程安全,请在 Synchronize 方法中调用该方法,以确保它在主线程中执行。
当方法在主线程中执行时,当前线程的执行将暂停。
注意:从主线程调用Synchronize同步是安全的。
注:您也可以使用临界区段或多读独占写同步器来保护不安全的方法。
例如,当你想与 VCL 或 FireMonkey 组件交互时,就可以使用同步。使用就地匿名方法来解决向要同步的方法传递变量的问题。
Synchronize(
procedure
begin
Form1.Memo1.Lines.Add('Begin Execution');
end);
二、Queue 说明
在主线程中执行方法调用。
Queue 会使 AMethod 指定的调用在主线程中异步执行,从而避免多线程冲突。
警告: 如果调用线程是主线程,Queue 会直接(同步)执行调用。在这种情况下,请使用 ForceQueue 在主线程中排队执行方法调用
AMethod 会关联调用者线程:
对于静态方法,您可以使用 AThread 参数将 AMethod 与任何线程关联。
如果不需要知道主线程中调用线程的信息,可以使用 nil/NULL 作为 AThread 参数。
RemoveQueuedEvents 会使用这些线程信息来查找合适的队列方法。
如果不确定方法调用是否线程安全,可在 Synchronize 或 Queue 方法中调用该方法,以确保它在主线程中执行。
与 Synchronize 不同的是,当前线程可以继续执行。主线程最终会处理所有队列方法。
注:您还可以使用临界区段或多读独占写同步器来保护不安全的方法。
区别就是一个是线程可以继续(Queue)执行,一个是阻塞(Synchronize )执行。