Qt QNetworkAccessManager长延迟发出完成信号



我使用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秒,这真的不太好。

文件上传在后台做一些缓冲(qt套接字缓冲区,系统套接字缓冲区,网络缓冲区)所以'进度'信号只是意味着你发送数据到某个地方,服务器也没有收到它。当所有数据传输到远程端并刷新缓冲区时,发出'finished'信号。如果您需要知道传输的确切大小,您可以查找禁用请求或套接字或qnam缓冲/缓存。

相关内容

  • 没有找到相关文章

最新更新