Qt中的多线程通信

1.Qt的UI线程中定义一个Qtimer,每个一段时间触发一个信号sig_A,这个sig_A与UI线程的槽函数slot_A相关联connect,但是并非每次emit sig_A都会触发slot_A,也就是说信号会丢失,为什么?

本质上QTimer相当于创建了新的thread,Qt的线程间通过信号与槽通信需要明晰信号与槽的通信机制,什么是Qt::QueuedConnection,Qt::DirectionConnection, moveToThread()做了什么工作。

 

Qt::AutoConnection

自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接。如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接。

Qt::DirectConnection

直接连接:当信号发射时,槽函数将直接被调用。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。

Qt::QueuedConnection

队列连接:当控制权回到接受者所依附线程的事件循环时,槽函数被调用。槽函数在接收者所依附线程执行。也就是说:这种方式既可以在线程内传递消息,也可以跨线程传递消息

Qt::BlockingQueuedConnection

与Qt::QueuedConnection类似,但是会阻塞等到关联的slot都被执行。这里出现了阻塞这个词,说明它是专门用来多线程间传递消息的。

 

2.Qt的信号槽函数只默认支持Qt的类型和C++提供的内建的基本类型,比如int double float等,根本不支持C++的std::string std::vector 自定义的struct类型。所以需要用Qt提供的Q_DECLARE_METATYPE和qRegisterMetaType来声明和注册自定义的类型和C++的其他类型。

参考文章:

1.Qt::ConnectionType(信号与槽的传递方式)

2.Qt多线程通信 https://blog.csdn.net/hebbely/article/details/79428336