qt多線程信號槽傳輸方式

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

轉載於:https://www.cnblogs.com/tiandsp/p/7580586.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章