实现QIODevice :: writeData,令人困惑的文档

时间:2017-10-10 17:59:18

标签: c++ qt qiodevice

我正在尝试为实时音频应用程序实现双缓冲区,QAudioInput要求它成为QIODevice的子类。我发现这个方法的文档很混乱。

首先,文档中的方法签名与QT 5.9.2的标题不匹配,后者具有virtual qint64 writeData(const char *data, qint64 len) = 0;

文档虽然有这个签名:qint64 QIODevice::writeData(const char *data, qint64 maxSize)

maxSize参数让我感到困惑,因为它意味着我只能缓冲一些数据,文档中也暗示了这些数据:

  

从数据写入最多maxSize个字节到设备。返回写入的字节数,如果发生错误,则返回-1

然而,紧接着文件说明了这一点,这似乎与我相矛盾:

  

重新实现此功能时,此函数在返回之前写入所有可用数据非常重要。这是QDataStream能够在课堂上操作所必需的。 QDataStream假设所有信息都已写入,因此如果出现问题则不会重试写入。

我的QIODevice实现是否负责在一次通话中缓冲所有数据?

1 个答案:

答案 0 :(得分:0)

他们基本上想说的是:传递的data长度为maxSize个字节。您的实现应该写入所有数据并返回写入的字节数。

可以写出更少的数据然后可用,但你不应该。如果这样做,某些使用您设备的类可能不会对此做出反应(如QDataStream)。这取决于QAudioInput处理写入调用的方式。如果它检查结果并且如果没有完全写入则再次写入丢失的数据,则不能写入所有数据。如果不是这种情况,则必须始终写入所有数据。

只需尝试一下:始终只写1个字节(并返回1)。如果它有效,那很好,如果不是,你必须总是写所有传递的数据,或者以-1失败。