2015-07-01 96 views
0

在同步模式下,QUDPSocket可以在沒有事件循環的情況下使用。 而且我發現下面的例子:Qt:同步UDP套接字中是否需要waitForReadyRead/waitForBytesWritten?

#include <QUdpSocket> 
#include <QTextStream> 

int main() 
{ 
    QTextStream qout(stdout); 

    QUdpSocket *udpSocket = new QUdpSocket(0); 
    udpSocket->bind(3838, QUdpSocket::ShareAddress); 

    while (udpSocket->waitForReadyRead(-1)) { 
     while(udpSocket->hasPendingDatagrams()) { 
      QByteArray datagram; 
      datagram.resize(udpSocket->pendingDatagramSize()); 
      QHostAddress sender; 
      quint16 senderPort; 

      udpSocket->readDatagram(datagram.data(), datagram.size(), 
            &sender, &senderPort); 
      qout << "datagram received from " << sender.toString() << endl; 
     } 
    } 
} 

我的問題是:是waitForReadyRead必要在這裏?如果我不擔心CPU消耗,可以使用一段時間(1)嗎? 如果我需要寫,是否有必要添加一個waitForBytesWritten?

我曾經在Qt下的同步模式下使用TCP套接字,在沒有waitForReadyRead調用的情況下它根本不工作。

+0

'QAbstractSocket'文檔指出,調用'waitForReadyRead'是讀取和調用'waitForBytesWritten'所必需的,用於刷新同步模式下的寫入更改。 'QTcpSocket'和'QUdpSocket'似乎沒有區別。 –

+0

但有人說QUDPSocket實際上是無緩衝的,所以不需要等待,因爲應用程序直接與操作系統的buffere交談? – Nyaruko

+1

這可能是真的,但文檔沒有說明,所以它是有風險的。您可以閱讀'QUdpSocket'源文件來驗證。 –

回答

0

是的。套接字內部使用非中斷平臺通知,並且這些只在事件循環控制線程時觸發。你的選擇是:

  1. 使用C++ 11的lambda /關閉寫異步代碼保持代碼的簡潔而不需要明確的幫助對象。或者用明確的QObject來編寫Qt 4風格的異步代碼,提供處理器插槽。

  2. 使用waitForXxxx方法編寫僞同步代碼,但需要注意在同一線程上運行的某些方法可能需要是可重入的。

  3. 使用本機網絡API。