Qt QNetworkAccessManager 发出完成信号的长时间延迟

Posted

技术标签:

【中文标题】Qt QNetworkAccessManager 发出完成信号的长时间延迟【英文标题】:Qt QNetworkAccessManager long delay to emit finished signal 【发布时间】:2014-06-23 10:23:21 【问题描述】:

我使用 QNAM 来处理使用 ftp 协议的上传。 整个过程有效,但我有一个奇怪的行为:

这是我的方法:

void ftp::uploadFile(const QString &origin, const QString &destination)

    QUrl url("ftp://"+host+""+destination);
    url.setUserName(user);
    url.setPassword(pwd);
    url.setPort(21);

    localFile = new QFile(origin, this);
    if (localFile->open(QIODevice::ReadOnly))
    
         reply = nam->put(QNetworkRequest(url), localFile);
         QObject::connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(transferProgress(qint64, qint64)));        
         QObject::connect(reply, SIGNAL(finished()), this, SLOT(transferFinished()));
    
    else qDebug() << localFile->errorString();

当我上传文件时,会发出 uploadProgress :

qDebug() << sent << "/" << total;

输出 0/x 直到 x/x 。 然后需要很长时间,可能最多 20 秒才能发出完成的信号。 为什么会出现这种延迟?

当进度为sent==total 但文件在另一端已损坏时,我尝试忽略完成的信号并自己发出信号。 (它并没有真正损坏,因为我只发送 jpg,生成的文件只有上半部分 jpg。很大一部分只是灰色。)

我想为我的用户提供一个进度条,其中 100% 确实意味着流程已完成。 上传 5 秒,然后以 100% 的速度停留 20 秒并不是很好。

【问题讨论】:

运行在什么传输模式下?主动还是被动?很可能它已经完成了文件的上传,但 FTP 服务器没有给出确认码。 我觉得一般是在ftp服务器上设置了打开的模式。 【参考方案1】:

文件上传会在后台进行一些缓冲(qt 套接字缓冲区、系统套接字缓冲区、网络缓冲区),因此“进度”信号仅表示您将数据发送到某个地方,也没有服务器接收到它。 当所有传输到远程端的数据和缓冲区都被刷新时,会发出“完成”信号。如果您需要知道传输的确切大小,您可以寻找禁用请求或套接字或 qnam 缓冲/缓存。

【讨论】:

那么我怎样才能得到实际的进展呢?

以上是关于Qt QNetworkAccessManager 发出完成信号的长时间延迟的主要内容,如果未能解决你的问题,请参考以下文章

QT 从 QWebView 的 QNetworkAccessManager 读取数据

Qt同步QNetworkAccessManager获取

QT中的QNetworkAccessManager可靠连接

使用 QNetworkAccessManager 的 Qt 控制台应用程序

Qt无法打开包含文件:'QNetworkAccessManager':没有这样的文件或目录

在 Qt 中使用 QNetworkAccessManager 的持久连接