2010-02-25 96 views
0

我是新來QT。我創建了對象類QNetworkAccessManager主窗口作爲父項。還註冊完成SIGNAL。它工作正常。 但我想知道它將在哪個線程中運行。它會阻止主線程嗎?如果我需要執行get操作的順序,我應該如何編寫代碼。 請給我一些示例,以正確理解概念。QNetworkAccessManager處理異步線程

回答

2

它肯定不會在主線程中運行,調用得到()是異步的。

例如,這將持續觸發GET請求:

while (condition) { 
    QNetworkRequest request; 
    request.setUrl(QUrl(m_ServerURL); 
    m_httpGetUpdatedFile->get(request); 
} 

你就必須爲它處理QNetworkReply完成信號的插槽。那個插槽基本上應該會針對你所做的每個獲取請求進行調用(即使它失敗了)。如果您需要跟蹤所有獲取請求的完成時間,則需要跟蹤您發佈的帖子數量,然後擁有自己的完成標誌或信號。

+0

感謝重播。 是完成插槽將在主線程中運行? 如果它在主線程中運行,它將阻塞主線程。爲此我正在使用一個樣本作爲波紋管。 ---- QNetworkAccessManager管理器; QEventLoop q; QTimer tT; tT.setSingleShot(true); connect(&tT,SIGNAL(timeout()),&q,SLOT(quit())); connect(&manager,SIGNAL(finished(QNetworkReply *)),&q,SLOT(quit())); QNetworkReply * reply = manager.get(QNetworkRequest(QUrl(「URL」))); tT.start(5k); q.exec(); ------ 是此方法correct.I'm計劃運行在輔助線程上面的代碼。 如果我在輔助線程中運行它會出現問題。 – 2010-03-02 06:44:52

0

QNAM不使用線程在後臺,但是這是爲你的應用程序代碼完全不可見。你看到的所有東西都會在主線程中運行。

QNAM在通常的Qt的方式工作,它會發出信號時,事情發生了,你將這些信號連接到自己的代碼插槽,做事多,因爲他們可以。如果他們沒有足夠的數據,那麼你的插槽不能阻塞等待新數據,他們必須返回。然後當/如果有更多的數據時他們會再次被調用(或者如果例如連接被終止,你會得到另一個信號)。

一些鏈接,如果你沒有看過這些: