qt多執行緒訊號槽傳輸方式

Dsp Tian發表於2017-09-23

//簡單介紹一下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(); 

相關文章