2013-11-22 24 views
0

我能夠刪除此警告,請在以下幾點建議。QSocketNotifier警告 - 在線程中使用套接字

QSocketNotifier: socket notifiers cannot be enabled from another thread 

每當有新的請求來到QTcpServer我創建新的對象 - xxx。此對象然後創建線程爲此套接字&發送接收數據在yyy對象的 dowork_socket()函數。在dowork_socket()函數內部,我發出信號signalTcpSocketWriteData()從套接字發送數據。

對象創建線程的新的socket - xxx(我不是粘貼完整的代碼):----

yyy * ptr; 
QTcpSocket *m_pTcpSocket; 

public slots: 
    void writeDataSlot(QByteArray data) 
    { 
     m_pTcpSocket->write(data); 
     m_pTcpSocket->flush(); 
    } 

對象,其中線移動 - yyy(我不是粘貼完整的代碼) :----

xxx *TcpSocketWrapper_ptr; 

signals: 
    void signalTcpSocketWriteData(QByteArray); 

public slots: 
    void dowork_socket(); 

內上述目的YYY構造器我連接信號signalTcpSocketWriteData到時隙writeDataSlot:---

connect(this, SIGNAL(signalTcpSocketWriteData(QByteArray)), TcpSocketWrapper_ptr, SLOT(writeDataSlot(QByteArray)), Qt::QueuedConnection); 

對象YYY的DoWork的功能: -

void TcpSocketThreadObject::dowork_socket() 
{ 
    QByteArray block; 


    block.append(" \n hi again .. !!!"); 

    emit signalTcpSocketWriteData(block); 
} 

我能夠通過上述方法&以上警告完全刪除數據發送成功。

1>現在我的問題是假設創建了兩個線程&兩個線程都同時發出信號,那麼在運行插槽時會有衝突嗎?
2>它會導致一些關鍵部分問題或排隊的事件&將不會同時執行?

請在這兩點上提出建議。

+0

任何人誰可以建議在這個線程? – Katoch

回答

0

這似乎太複雜了。您不需要創建線程來使用套接字。 無論如何,如果你這樣做,這裏有兩點需要牢記:

  • 與QTcpSocket不是線程安全本身
  • 只要你連接插槽時使用Qt :: QueuedConnection(或至少正確使用不同線程之間的隱式連接做到這一點)所有在連接槽內執行的代碼都將在對象的線程循環中執行。換句話說,從不同線程發出的信號將排隊。