2011-02-27 19 views
0

我正在構建一個Qt應用程序並使用QNetworkAccessManager來管理我的http請求。由於QNetworkAccessManager的異步性質,您必須綁定一個插槽以在完成時接收QNetworkReply。如何發送任意的下載請求到適當的處理程序

我是新來的多線程設計,所以我不知道如何處理這個。我將有3種不同類型的網絡答覆,需要在綁定的插槽中解析,然後傳遞給正確的處理程序。一個會提取一個鏈接,第二個會提取一張圖片,第三個會解析帖子請求的回覆以驗證它是否成功。所有這些都發生在QWidget子類中。

所以,我想知道這通常如何處理。正如我所看到的那樣,我完全基於直覺,因爲我對這個具體問題的閱讀很少,所以我會認爲有兩種方法可以解決這個問題。一個是根據調用重新綁定網絡管理器的finished()信號,另一個是使用某種狀態標誌並檢查這些信號以查看應答的預期結果。什麼是首選方法,不一定在這兩者之間,這只是我能想到的自己,有經驗的人可能會有更好的解決方案。

現在,我對C++也相當陌生,所以如果後者是更好的方法,在這種情況下處理標誌的最佳方法是什麼?我會使用bitset,枚舉/標誌設置功能還是其他?多謝你們!

+0

當您提出請求時,您是否知道由於此請求會得到哪種類型的答覆? – 2011-02-27 08:28:04

回答

0

如果您知道作爲特定請求的結果而獲得的回覆類型,您可以將void QNetworkReply::finished()信號連接到合適的處理程序。

+0

嗯,我處理它的方式是我創建了一個枚舉整個不同的狀態,NO_REQUEST,INITIAL_REQUEST,IMAGE_REQUEST,POST_REQUEST和我連接一個插槽到QNetworkAccessManager :: finished(),然後通過switch語句並轉發回覆到基於枚舉狀態的正確處理程序。對我來說似乎很好,看到有什麼問題/這種方法? – kryptobs2000 2011-02-27 18:54:10

+0

這是另一種解決方案,是的。如果你打開類型,你應該看到[Clean Code Talks - Inheritance,Polymorphism,&Testing](http://www.youtube.com/watch?v=4F72VULWFvc)。使用QNetworkReply :: finished()似乎是更清晰的解決方案,如果您知道並在請求發出時有權訪問處理程序。如果您在收到答覆之後才知道或無法使用處理程序,那麼您將被迫使用您的解決方案,因爲在這種情況下,我的方法無法工作。 – 2011-02-27 19:17:55

+0

我可以做到這一點,我想我只是認爲你建議的方式比我做的更糟糕,但我想它是相反的。感謝您的鏈接,我會檢查出來。 – kryptobs2000 2011-02-27 19:48:41

相關問題