实现 QIODevice::writeData,文档混乱
Posted
技术标签:
【中文标题】实现 QIODevice::writeData,文档混乱【英文标题】:Implementing QIODevice::writeData, confusing documentation 【发布时间】:2017-10-10 17:59:17 【问题描述】:我正在尝试为实时音频应用程序实现双缓冲区,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
实现是否负责在一次调用中缓冲所有数据?
【问题讨论】:
更改参数的名称对函数的签名没有影响。还是虚拟的打扰了你? 不错的发现! :] QDataStream 的当前实现,似乎没有使用writeData
。
困扰我的是参数名称的含义。对我来说 maxSize 意味着我不需要写所有的数据,而 len 没有任何含义。结合我想要澄清的令人困惑的文档。
从第 267 行开始有更多解释:code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/io/qiodevice.cpp
【参考方案1】:
他们基本上想说的是:传递的data
是maxSize
字节长。您的实现应该写入所有数据并返回写入的字节数。
可以写入比可用数据更少的数据,但您不应该这样做。如果你这样做了,一些使用你的设备的类可能不会对此做出反应(比如 QDataStream)。这取决于QAudioInput
如何处理写调用。如果它检查结果并在未完全写入的情况下再次写入丢失的数据,则不写入所有数据是可以的。如果不是这样,您必须始终写入所有数据。
只需尝试一下:始终只写入 1 个字节(并返回 1)。如果它有效,那很好,如果不是,您必须始终写入所有传递的数据,否则失败并返回 -1。
【讨论】:
以上是关于实现 QIODevice::writeData,文档混乱的主要内容,如果未能解决你的问题,请参考以下文章