自动连接(AutoConnection),默认的连接方式。:如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接,如果发送者与接受者处在不同线程,等同于队列连
直接连接(DirectConnection):当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行。
队列连接(QueuedConnection):当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行。
Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。
说明:采用主线程显示数据,子线程处理数据的机制。
情况一:AutoConnection
connect(dataThread,SIGNAL(ptr_dataMessage(float*)),this, SLOT(doReceiveData_slots(float*)));
打印结果:
emit m_pLineZBuf
emit m_pLineZBuf
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf
明显不是信号发出去后,槽函数立马执行,采用的是QueuedConnection方式,信号函数通过emit把信号发送到队列后继续执行后面代码,所以就出现几个emit m_pLineZBuf,一个join m_pLineZBuf
情况二:DirectConnection
connect(dataThread,SIGNAL(ptr_dataMessage(float*)),this, SLOT(doReceiveData_slots(float*)),Qt::DirectConnection);
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf
join m_pLineZBuf
emit m_pLineZBuf