Qt的QNetworkAccessManager长延迟为发射信号成品(Qt QNetworkAcce

2019-10-20 08:10发布

我用一个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();
}

当我上传文件,上传进度的发出:

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

输出0 / X,直到X / X。 然后,它需要很长的时间,完成的信号被发射也许长达20秒之前。 为什么这种延迟?

我试着忽略成品信号和发射信号时, 自己的进步是在sent==total ,但该文件在另一端损坏。 (这不是真正的损坏,我只发送JPG格式,生成的文件是上半区唯一JPG,很大一部分就是灰色的。)

我想提供我的用户有一个进度条,其中100%的真正含义过程结束。 上传5秒,然后在100%保持20秒是不是真的很好。

Answer 1:

文件上传的确在一些背景缓冲(QT socket缓存,系统套接字缓冲区,网络缓冲区),因此“进步”信号只是意味着你将数据发送到某个地方,也不是服务器已收到。 当转移到远程侧的所有数据和缓冲器被刷新,而“完成”信号被发射。 如果您需要知道确切的尺寸转移,你可以寻找无效请求或插座(S)或qnam buffring /缓存。



文章来源: Qt QNetworkAccessManager long delay to emit finished signal