在同步模式下,可以在没有事件循环的情况下使用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调用它根本不起作用。
答案 0 :(得分:1)
是。套接字在内部使用非中断平台通知,这些仅在事件循环或 waitFor...
方法控制线程时触发。您的选择是:
使用C ++ 11 lambdas / closures编写异步代码,以保持代码简洁,而无需显式的辅助对象。或者使用提供处理程序槽的显式QObject
编写Qt 4样式的异步代码。
使用waitFor...
方法编写伪同步代码,但需要注意的是,在同一个线程上运行的QObject
的某些方法可能需要是可重入的。
使用本机网络API。