1. 程式人生 > >qt多線程信號槽傳輸方式

qt多線程信號槽傳輸方式

lin 產生 pos 信號 nec socket 發出 cal soc

//簡單介紹一下QT信號與槽的連接方式:
//Qt::AutoConnection表示系統自動選擇相應的連接方式,如果信號與槽在同一線程,就采用Qt::DirectConnection,
//如果信號與槽不在同一線程,將采用Qt::QueuedConnection的連接方式。
//Qt::DirectConnection表示一旦信號產生,立即執行槽函數。
//Qt::QueuedConnection表示信號產生後,將發送Event給你的receiver所在的線程,postEvent(QEvent::MetaCall,...),
//slot函數會在receiver所在的線程的event loop中進行處理。

//Qt::BlockingQueuedConnection表示信號產生後調用sendEvent(QEvent::MetaCall,...),
//在receiver所在的線程處理完成後才會返回;只能當sender,receiver不在同一線程時才可以。
//Qt::UniqueConnection表示只有它不是一個重復連接,連接才會成功。如果之前已經有了一個鏈接(相同的信號連接到同一對象的同一個槽上),那麽連接將會失敗並將返回false。
//Qt::AutoCompatConnection與QT3保持兼容性
//說明一下,對於任何的QThread來說,其線程只存在於run()函數內,其它的函數都不在線程內,所以此處要采用Qt::BlockingQueuedConnection,
//因為當SOCKET有數據到達時就會發出readyRead()信號,但是此時可能之前的receiveFile()還未執行完畢,之前使用的Qt::AutoConnection,
//結果傳輸大文件的時候就會出錯,原因就在於只要有數據到達的時候,就會連接信號,但是數據接收還沒處理完畢,而Qt::BlockingQueuedConnection會阻塞
//此連接,直到receiveFile()處理完畢並返回後才發送信號。
qDebug()<<"run thread:"<<QThread::currentThreadId();
//connect(tcpSocket,SIGNAL(readyRead()),this,SIGNAL(receiveSgl(tcpSocket)));
// connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(receiveFile()),Qt::BlockingQueuedConnection);
exec();
}

qt多線程信號槽傳輸方式