代码之家  ›  专栏  ›  技术社区  ›  drahnr

同步中的C++/QT下载文件

  •  1
  • drahnr  · 技术社区  · 15 年前

    我想实现在一个单独的线程中下载一个文件并存储该文件, 但是我没有找到一个合适的方法来实现这一点,没有邪恶的延迟(非常频繁的下载小文件,所以信号+插槽太慢)。 我想要达到的目标: (伪码)

    request file;
    wait for download finishing, timeout or error;
    save downloaded file;
    

    如果可能的话,我更喜欢QNetworkAccessManager的例子。 谢谢你的小费。

    编辑:只是说清楚,我想要的信号和插槽不是因为设计以及缺乏速度。

    edit2:这个下载只是关于同步部分的下载文件,线程没有问题。 问题是,qt不提供这样做的API,我不喜欢hotsping等待。

    edit3:示例代码应该可以工作,但不能:

    QNetworkAccessManager net;
    QNetworkReply *re (net.get( QNetworkRequest( QUrl( Qstring("www.blah.org/key") ) ) ));
    if (re->waitForReadyRead(-1)) //! @bug this does not work as supposed, waitForRead returns false and returns INSTANTLY!!
        qDebug() << "ReadyRead yeha!!!";
    if (re->error()) {
        qDebug() << "Can't download" << re->url().toString()
                << ":" << re->errorString();
    } else {
        img->load(re->readAll());
        qDebug() << "Savin IMG";
    }
    delete re;
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Idan K    15 年前

    我需要相似的东西,但原因不同。由于qhttp和qnetworkaccessmanager都是异步的,您可以使用单独的事件循环,因此可以找到基于qhttp的完整示例。 here .对于QNetworkAccessManager,修改它不应该太困难。

    值得一提的是,你对信号/时隙“慢”的印象可能是错误的。您是否确实对代码进行了分析以确定这一点?

    无论您为信号/插槽支付什么样的罚款,当查看单个文件下载所需的时间时,都可能忽略不计。更重要的是,这样做是非常“非qt”的。这些类的设计是有原因的。

    在一天结束的时候 如果 您确实遇到了信号/插槽问题(这也是一个值得怀疑的问题),我建议您不要在这个特定的任务中使用qt,也许普通的C套接字是一个更好的主意(或者在它们周围使用一个薄包装器来保存可能需要一些额外工作的错误处理)。

        2
  •  0
  •   Prakash Nadar    14 年前

    同步网络访问是一个坏主意,因为它会带来糟糕的用户界面体验。除此之外,你认为一只虫子不是一只虫子。只是记录错误。