【问题标题】:How to increase QNetworkReply::downloadProgress signal frequency?如何增加 QNetworkReply::downloadProgress 信号频率?
【发布时间】:2017-04-04 10:09:27
【问题描述】:

我正在尝试将进度观察添加到 Qt 的 FileDownloader 示例中。
它有效,但不是我想要的方式 - downloadProgress 信号太罕见了!
约 300 Kb 文件只需两次。

这导致无法在 GUI 中流畅地显示下载进度。

代码:

...
QNetworkReply* reply = m_WebCtrl.get(request);
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(onDownloadProgress(qint64,qint64)));

void FileDownloader::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) 
{
    qDebug() << "Download progress:" << bytesReceived << bytesTotal;
}

输出:

Download progress: 19954 from -1 Download progress: 288322 from -1 Download progress: 288322 from 288322

有没有办法让downloadProgress 信号更频繁地出现?

附: libcurl进度回调日志:

Download progress: 2753 of 0 Download progress: 4141 of 0 Download progress: 5995 of 0 Download progress: 7383 of 0 ...

【问题讨论】:

    标签: c++ qt network-programming qnetworkaccessmanager qnetworkreply


    【解决方案1】:

    TL;DR 最简单的方法是重新编译 Qt 并更改以下行:

    // in qtbase/src/network/access/qnetworkreply.cpp
    const int QNetworkReplyPrivate::progressSignalInterval = 100;
    

    ...具有小于 100 的值(以毫秒为单位)。


    如果您查看QNetworkReply(和相关类)的 Qt 源代码,您会发现以下内容:

    if (downloadProgressSignalChoke.elapsed() >= progressSignalInterval) {
        downloadProgressSignalChoke.restart();
        emit q->downloadProgress(bytesDownloaded,
                             totalSize.isNull() ? Q_INT64_C(-1) : totalSize.toLongLong());
    }
    

    所以你可以看到控制信号发射的是downloadProgressSignalChokeprogressSignalInterval

    • downloadProgressSignalChokeQElapsedTimer,它是私有 Qt 类 QNetworkReplyPrivate 的成员,据我所知,您无法更改返回的持续时间(以毫秒为单位)。
    • progressSignalIntervalQNetworkReplyPrivate 的静态常量成员,其值在qnetworkreply.cpp100 中定义:
    const int QNetworkReplyPrivate::progressSignalInterval = 100;
    

    这意味着刷新间隔(显然)设置为恒定的 100 毫秒。

    【讨论】:

    • 感谢这个有趣的想法,但我既没有时间也不想重新编译 Qt :( 所以我就写libcurl Qt-wrapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多