【delphi】线程终的Synchronize和Queue的区别

我们经常在做程序开发的时候会使用到线程,但是线程如果需要操作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 )执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值