找回密码
 立即注册
收起左侧

http通信

11
回复
8752
查看
[复制链接]
累计签到:103 天
连续签到:1 天
来源: 2016-8-10 17:42:06 显示全部楼层 |阅读模式
10Qter豆
我从服务器获取10个照片的url,每个url最后是照片的名字,我想一张一张的下载,然后保存成各自照片的名字,下面是我的请求照片和下载的程序,为什么请求照片之后没有等到照片下载完了就请求第二张照片呢,导致最后保存的只有最后一张照片,大家帮我看看,是我哪里错了呢,还是它的机制就是这样的,太着急了,谢谢啊
void HttpThread::startDownloadSlot()
{
    qDebug()<<"download......";
    qDebug()<<"requestDownload id::"<<QThread::currentThreadId();
    getManger = new QNetworkAccessManager(this);
    QObject::connect(getManger,SIGNAL(finished(QNetworkReply*)),this,SLOT(downImageReplySlot(QNetworkReply*)));

    for(int i=0;i<picUrlList.count();i++)
    {
        QNetworkRequest re;
        re.setUrl(QUrl(picUrlList));
        qDebug()<<picUrlList;
        picRes.picName = picNameList;
        qDebug()<<picRes.picName;
        getManger->get(re);//这里执行完了之后,为什么不去执行downImageReplySlot(QNetworkReply*)槽呢,而是继续for循环,结果保存的名字就不对了
    }
    qDebug()<<"download end...";
}
下面是downImageReplySlot(QNetworkReply*)槽里的代码:
            imageData = reply->readAll();
            qDebug()<<picRes.picName;
            if(image.loadFromData(imageData,"JPG"))
            {
                qDebug()<<"JPG";
                if(image.save(tmpPath.append(picRes.picName)))
                {
                    qDebug()<<"QQQQQQQQQQQQQQQQWWWWWWWWWWWWWWWWWWWWWWEEEEEE";
                }
                else
                {
                    qDebug()<<"this pic download falied,jump next";
                }
            }

最佳答案

查看完整内容

信号槽机制是异步的,而不是同步机制,也就是说你不能把它当成一个函数来使用。你for都没执行完,怎么能跳到去执行downImageReplySlot(QNetworkReply*)槽呢?
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2016-8-10 17:42:07 显示全部楼层
信号槽机制是异步的,而不是同步机制,也就是说你不能把它当成一个函数来使用。你for都没执行完,怎么能跳到去执行downImageReplySlot(QNetworkReply*)槽呢?
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2016-8-11 10:31:30 显示全部楼层
楼上说的对,保存本的在操作。
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-8-11 11:47:43 显示全部楼层
cai901022 发表于 2016-8-11 09:48
信号槽机制是异步的,而不是同步机制,也就是说你不能把它当成一个函数来使用。你for都没执行完,怎么能跳 ...

啊,那这样子的话,我要怎么才能保存成URL中名字呢,因为我后来得有查重的功能,之前下载过的照片就不去下载了,这样子我没法去比较啊?我要怎么做呢?
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-8-11 11:50:36 显示全部楼层
霹雳终结者 发表于 2016-8-11 10:31
楼上说的对,保存本的在操作。

我如果保存到本地的话,这样子,我怎么知道哪张应该对应着URL中的哪个名字呢?如果其中的一个没下载下来,这要怎么操作呢?我还能有什么方法呀,我想实现一次获取是个url,然后查重,有重复的就不在下载了,这要怎么操作啊?
回复

使用道具 举报

尚未签到

2016-8-14 23:31:53 显示全部楼层
你弄个QList来保存这些url嘛,下载完一个就去掉一个
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-8-17 11:32:09 显示全部楼层
Joey_Chan 发表于 2016-8-14 23:31
你弄个QList来保存这些url嘛,下载完一个就去掉一个

这样子不合理吧,要是中间某一个没下载下来,就不知道去掉list里的哪个url了,是吧。最后我找到了方法,下载的时候reply->url()->toString();能获得当前下载的url然后就能得到名字了
回复

使用道具 举报

尚未签到

2016-8-17 22:46:34 显示全部楼层
冷月有情 发表于 2016-8-17 11:32
这样子不合理吧,要是中间某一个没下载下来,就不知道去掉list里的哪个url了,是吧。最后我找到了方法, ...

我的意思就是你这个方法。。。。。下载完当然要校验的啊。。
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-8-18 11:26:59 显示全部楼层
Joey_Chan 发表于 2016-8-17 22:46
我的意思就是你这个方法。。。。。下载完当然要校验的啊。。

恩,你说的也太简明扼要、言简意赅了,我想不到那么深,还是初级水平,我还想请教你一个问题,也是http通信的,我一个槽里面实现删除缓存中的照片,但是有的时候碰巧http线程还在下载,这时候删除不干净呢 缓存里面还会有刚刚下载下来的,这个情况要怎么办呢?我尝试在这个槽函数开始停掉下载线程,但是开始的时候是不是有接着继续下载啊,缓存里面还是有呢?
回复

使用道具 举报

尚未签到

2016-8-19 00:14:17 显示全部楼层
冷月有情 发表于 2016-8-18 11:26
恩,你说的也太简明扼要、言简意赅了,我想不到那么深,还是初级水平,我还想请教你一个问题,也是http通 ...

你不如弄两个文件夹,一个正在下载,下载完后转移到缓存
回复

使用道具 举报

累计签到:103 天
连续签到:1 天
2016-8-19 09:19:44 显示全部楼层
Joey_Chan 发表于 2016-8-19 00:14
你不如弄两个文件夹,一个正在下载,下载完后转移到缓存

我想过,但是我是一组一组的下载,这样一组不下载完毕,就没法转移到缓存,就没法播放了,等待的时间会有点久,而且删除的时候,缓存中倒是可以删除干净,如果删除的时候碰巧一组该没下载完毕,那下载文件夹中的要怎么删除掉呢,因为当满足条时要开始下载新的url的照片,下载文件夹里就有之前下载的了,也是有删除不干净的问题吧。我想请教,http的下载线程,我用的httpDownloadThread->moveToThread(hthread)这种方法,我重置的槽里面hthread->stop()能关掉这个线程么,这时候如果已经发送出去了get(request),他会立刻停止下载么?注:重置所在槽和下载是两个线程
回复

使用道具 举报

尚未签到

2016-8-20 01:55:35 显示全部楼层
冷月有情 发表于 2016-8-19 09:19
我想过,但是我是一组一组的下载,这样一组不下载完毕,就没法转移到缓存,就没法播放了,等待的时间会有 ...

那教你一个很笨的方法,直接用QNetworkAccessManager的自带cache,不需要你自己去管理缓存了。

你可以设定让其在离线下也能读缓存。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了