Qt使用connect连接信号与lambda表达式需要注意

最近使用多线程和QTimer时,发现QTimer的启停并不能在线程中使用,目前也没有查到更多的信息,但是通过弯路完成了启停,即发射信号控制信号的启停,但是槽函数为lambda表达式需要注意以下事项:

在Qt中,当使用Qt::ConnectionType参数Qt::QueuedConnection时,使用this作为接收者的区别在于信号在发送时是否在调用线程中直接触发槽函数。

当接收者是this时,信号的槽函数将在接收者所属的线程中执行。这意味着如果发送信号的线程和接收者在不同的线程中,信号将被放入接收者的事件队列中,等待接收者的线程返回到事件循环并处理该事件。这可以确保槽函数在接收者所属的线程中安全执行,避免了多线程访问的竞态条件。
当接收者不是this,即采用lambda表达式作为槽函数时,槽函数将在发送信号的线程中直接执行,而不管接收者所属的线程。这意味着槽函数会立即执行,而不会被放入接收者的事件队列中等待。这可能会引发多线程访问的竞态条件和线程安全问题。

因此,使用this作为接收者可以保证槽函数在接收者所属的线程中执行,从而确保线程安全。而使用lambda表达式作为槽函数时,需要确保槽函数的实现是线程安全的,以避免潜在的问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值