Qt:在同步UDP套接字中是否需要waitForReadyRead/waitForBytesWritten
Qt: Is waitForReadyRead/waitForBytesWritten necessary in a synchronous UDP socket?
QUDPSocket可以在同步模式下在没有事件循环的情况下使用。我发现了下面的例子:
#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消耗,我可以用while(1)代替吗?如果我需要写作,是否需要添加waitForBytesWritten?
我曾经在Qt下以同步模式处理TCP套接字,如果没有waitForReadyRead调用,它根本无法工作。
是。套接字在内部使用非中断平台notifications,并且这些notifications只有在事件循环或waitFor...
方法控制线程时才会触发。您的选择是:
-
使用C++11 lambdas/闭包编写异步代码,以保持代码简洁,而不需要显式的辅助对象。或者编写带有显式
QObject
s的Qt 4风格异步代码,这些代码提供处理程序槽。 -
使用
waitFor...
方法编写伪同步代码,但需要注意的是,在同一线程上运行的QObject
的某些方法可能需要是可重入的。 -
使用本机网络API。
相关文章:
- 没有找到相关文章