Qt QNetworkAccessManager长时间发出完成信号

时间:2014-06-23 10:23:22

标签: c++ qt qt5 qnetworkaccessmanager qnetworkreply

我使用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秒并不是很好。

1 个答案:

答案 0 :(得分:0)

文件上传在后台进行一些缓冲(qt套接字缓冲区,系统套接字缓冲区,网络缓冲区),以便进行“进展”。信号只是意味着您将数据发送到某个地方,而服务器也没有收到它。 虽然&#39;完成&#39;传输到远程端的所有数据和刷新缓冲区时发出信号。如果您需要知道转移的确切大小,您可能会寻找禁用请求或套接字或qnam buffring / caching。