gpt4 book ai didi

c++ - Qt:同步 UDP 套接字中是否需要 waitForReadyRead/waitForBytesWritten?

转载 作者:行者123 更新时间:2023-11-30 05:41:23 28 4
gpt4 key购买 nike

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... 方法控制线程时触发。您的选择是:

  1. 使用 C++11 lambdas/闭包编写异步代码以保持代码简洁,无需显式帮助对象。或者使用提供处理程序插槽的显式 QObject 编写 Qt 4 风格的异步代码。

  2. 使用 waitFor... 方法编写伪同步代码,注意在同一线程上运行的 QObject 的某些方法可能需要可重入。

  3. 使用原生网络 API。

关于c++ - Qt:同步 UDP 套接字中是否需要 waitForReadyRead/waitForBytesWritten?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167605/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com