QIODevice :: waitForReadyRead是否隐式刷新输出队列(waitForBytesWritten)?

时间:2015-10-19 09:41:26

标签: c++ qt sockets qt4 qabstractsocket

如果我想将数据写入远程端并等待其答案,我至少需要waitForReadyRead。但在调用之前,我是否需要使用waitForBytesWritten手动刷新输出队列,或者Qt是否会自动刷新写入队列?我正在同步操作(阻塞),因此在此函数中,我无法使用事件循环或本地事件循环。

使用std::cin时,我们可以确定std::cout之前写入的字节已被刷新。这是类似的情况 - 它是否也适用于Qt套接字?

2 个答案:

答案 0 :(得分:0)

如果你看一下作为抽象基类的source code,QIODevice在waitForReadyRead中做的很少,而且它可以用于继承类的实现:

bool QIODevice::waitForReadyRead(int msecs)
{
    Q_UNUSED(msecs);
    return false;
}
  

是否也适用于Qt套接字?

正如您所声明的那样,您已经同步操作,我认为您已经选择了这个原因并且知道在主线程上,任何存在的GUI都会在调用{{}时调用{1}}。通常,首选QIODevice的异步使用,Qt是一个事件驱动的框架。

然而,Qt docs州:

  

QIODevice的某些子类,例如QTcpSocket和QProcess,是异步的。

因此,如果您的QIODevice是QTcpSocket之类的套接字,那么不应该在调用waitForReadyRead时致电waitForBytesWritten

如果是非同步设备,则需要它。

答案 1 :(得分:0)

我随后向Thiago Macieira(QtCore维护者)询问了这个问题,他回答说,对于QAbstractSocket,waitForBytesWritten和waitForReadyRead都会写入等待切换到操作系统的qt缓冲区中的待处理字节。

如果远程站点由于等待其他(本地)端读取数据而被阻止,那么仅等待写入字节且仅在之后读取传入字节的应用程序可能会死锁。由于远程端块,它无法读取本地发送的数据。因此,如果本地端写入太多而使其阻塞,则每个端口都会等待另一个读取其数据和死锁。

因此,bytesWritten和readyRead等待函数都处理qt read和qt write buffer。 waitForBytesWritten甚至可以发出readyRead信号,这是我没想到的。所以waitForBytesWritten调用基本上是多余的,可以删除。