最近使用多线程和QTimer时,发现QTimer的启停并不能在线程中使用,目前也没有查到更多的信息,但是通过弯路完成了启停,即发射信号控制信号的启停,但是槽函数为lambda表达式需要注意以下事项:
在Qt中,当使用Qt::ConnectionType参数Qt::QueuedConnection时,使用this作为接收者的区别在于信号在发送时是否在调用线程中直接触发槽函数。
当接收者是this时,信号的槽函数将在接收者所属的线程中执行。这意味着如果发送信号的线程和接收者在不同的线程中,信号将被放入接收者的事件队列中,等待接收者的线程返回到事件循环并处理该事件。这可以确保槽函数在接收者所属的线程中安全执行,避免了多线程访问的竞态条件。
当接收者不是this,即采用lambda表达式作为槽函数时,槽函数将在发送信号的线程中直接执行,而不管接收者所属的线程。这意味着槽函数会立即执行,而不会被放入接收者的事件队列中等待。这可能会引发多线程访问的竞态条件和线程安全问题。
因此,使用this作为接收者可以保证槽函数在接收者所属的线程中执行,从而确保线程安全。而使用lambda表达式作为槽函数时,需要确保槽函数的实现是线程安全的,以避免潜在的问题。