2009-11-02 58 views
1

我想實現在單獨的線程中下載文件並存儲該文件,但我無法找到一個合適的方式來實現這個沒有惡意延遲(相當頻繁下載小文件,所以信號+插槽太慢)。 我想達到什麼: (僞碼)同步的C++/Qt下載文件

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

我寧願用QNetworkAccessManager如果可能的例子。 謝謝你的任何提示。

編輯:只需要清楚,我想要的信號和插槽不是因爲設計和速度的缺乏。

編輯2:此下載只是關於同步部分的下載文件,線程是沒有問題的。 問題是,QT沒有提供這樣做的API,我不熱衷於等待。

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; 
+0

似乎沒有本地事件循環你的「重新」甚至不知道它完成。我遇到過類似的問題。附:不要直接刪除QNetworkReply,請使用「deleteLater」。 – QtRoS 2015-02-17 21:42:42

回答

1

我需要類似的東西,但出於不同的原因。由於QHttp和QNetworkAccessManager都是異步的,你可以使用單獨的事件循環,所以可以找到一個基於QHttp的完整示例here。對QNetworkAccessManager進行修改應該不會太困難。

值得一提的是,您對信號/插槽「很慢」的印象可能是錯誤的。你有沒有真正分析你的代碼來確定這一點?

無論您爲信號/插槽付出的代價是多少,在查看單個文件下載所花費的時間時,可能會忽略不計。更重要的是,用這種方式做事非常「非Qt」。這些類是這樣設計的。

在一天如果你確實從信號/插槽痛苦(這又是,懷疑)結束後,我會建議不要使用Qt爲這個特殊的任務,也許普通的舊的C座是一個更好的主意(或者在它們周圍使用薄的包裝來保存可能需要額外工作的錯誤處理)。

+0

嗯,我希望不必在並行線程中使用exec()。 你給了我一個想法:-D謝謝 – drahnr 2009-11-03 14:44:50

+0

確定3小時的搜索後,我摔倒了這個: http://wiki.qtcentre.org/index.php?title=Keeping_the_GUI_Responsive 它和你建議我一樣,我這樣做,它的工作原理。謝謝。你解決了這個問題:-) – drahnr 2009-11-03 23:44:34

0

同步網絡訪問是一個壞主意,因爲它會導致不良的用戶界面體驗。除了你認爲的錯誤不是一個錯誤。它只是錯誤地記錄。

+0

同步這些對於測試工具,單元測試甚至服務器邏輯來說都是非常好的事情/這些東西只是不能實時響應。 – 2015-06-26 20:38:15