QTcpSocket中waitFor系列函数在windows上可能随机失效的解决办法

众所周知,QTcpSocket中的write和read函数是异步的,也就是非阻塞的。如果我们需要同步读写,就必须用QT为我们提供的waitForConnected、 waitForDisconnected、waitForBytesWritten、waitForReadyRead这四个函数。这看起来是一件很完美的事情,然而,QT文档中对waitFor系列函数有这样一句描述:

Note: This function may fail randomly on Windows.

是的,waitFor系列函数在Windows系统上可能会发生随机错误,这无疑是一件很让人无语的事情。幸运的是,QT文档在之后给出了解决方案:我们可以利用EventLoop和QTcpSocket类中的connected() 、disconnected() 、bytesWritten()、readyRead() 四个信号来分别实现上述四个函数。下面给出的是用QEventLoop类和bytesWritten()实现的类似于waitForBytesWritten函数的功能:

QEventLoop loop;
connect(m_socket, &MySocket::loopStopSignal, &loop, &QEventLoop::quit);
QString request = QString("wdnmd");
socket->write(request.toUtf8().data());
loop.exec();

MySocket类继承于QTcpSocket类,m_socket是MySocket类的一个实例。我们还要在MySocket类中定义一个槽函数loopStopSlot,然后在MySocket类的构造函数中把bytesWritten信号与loopStopSlot绑定:

void MySocket::loopStopSlot(qint64 bytes)
{
    emit loopStopSignal();
}
    //这段代码写在构造函数中
    connect(this, &MySocket::bytesWritten, this, &MySocket::loopStopSlot);

其余三个函数的实现方式同理。
另外不要忘了加上 QEventLoop的头文件。
以上代码仅在QT5上测试过。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值