实现 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】:

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

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

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

【讨论】:

以上是关于实现 QIODevice::writeData,文档混乱的主要内容,如果未能解决你的问题,请参考以下文章

如何用java实现文本域滚动条

实现可调整大小的文本区域?

JS调用CSS样式表问题(功能鼠标经过文本域是文本域边框颜色发生变化『给出能够实现功能的源码』)

陈建文综合业务:未来万物互联的实现基础

干货文:浅谈负载均衡算法与实现

Android自定义View实现文本轮播效果