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 调用,它根本无法工作。
最佳答案
是的。套接字在内部使用非中断平台通知,这些通知仅在事件循环或 waitFor...
方法控制线程时触发。您的选择是:
使用 C++11 lambdas/闭包编写异步代码以保持代码简洁,无需显式帮助对象。或者使用提供处理程序插槽的显式
QObject
编写 Qt 4 风格的异步代码。使用
waitFor...
方法编写伪同步代码,注意在同一线程上运行的QObject
的某些方法可能需要可重入。使用原生网络 API。
关于c++ - Qt:同步 UDP 套接字中是否需要 waitForReadyRead/waitForBytesWritten?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167605/