2017-08-31 144 views
1

Qt 4 docs有沒有辦法獲得有關QNetworkAccessManager隊列的信息?

注:QNetworkAccessManager隊列它接收到的請求。

現在,有兩件事情我想能(使用PyQt的)做:

  1. 檢查多少個請求是在QNetworkAccessManager的‘內部’隊列,等待發送。
  2. 檢查有多少請求已收到答案(即完成的QNetworkReplies的計數數量)。

我認爲這些信息在內部必須已經提供給QNetworkAccessManager,但我一直無法找到訪問它的方法。我在Qt文檔或其他地方找不到任何東西,但也許我正在尋找錯誤的地方或使用錯誤的術語。

有人能告訴我Qt是否提供某種方式來訪問有關QNetworkAccessManager隊列的信息?

只是爲了清楚起見:我可以想出一些方法來自己跟蹤這些事情,例如,通過檢查單個QNetworkReply狀態,但這不是我尋求的解決方案(只是作爲最後的手段,如果Qt沒有提供更簡單的方法)。

---編輯---那種東西我想到的

稍微-低於最低,但仍簡單的例子:

import sys 
import json 
from PyQt4 import QtNetwork, QtGui, QtCore 

def show_reply_content(reply): 
    print 'url from reply content: {}'.format(
     json.loads(str(reply.readAll()))['url']) 

    # Quit if all replies are finished 
    reply.deleteLater() 
    reply.manager().replies_unfinished -= 1 
    if not reply.manager().replies_unfinished: 
    app.quit() 

# Some initialization 
app = QtGui.QApplication(sys.argv) 
manager = QtNetwork.QNetworkAccessManager() 
manager.finished.connect(show_reply_content) 

# Add counter as dynamic attribute (quick and dirty) 
manager.replies_unfinished = 0 

# Schedule some dummy requests 
number_of_requests = 10 
for i in range(number_of_requests): 
    manager.get(QtNetwork.QNetworkRequest(
     QtCore.QUrl('http://httpbin.org/anything/{}'.format(i)))) 

    # Update counter 
    manager.replies_unfinished += 1 

# Start event loop 
app.exec_() 

在這種情況下是這樣的allFinished來自經理的信號會爲我節省幾行代碼。

+0

對我來說,這似乎像Qt來提供一個非常* *可能的API。 「QNetworkReply'實際上就是這個API」,只有當我做了一些額外的簿記。我知道這很容易實現,但如果信息必須在那裏,爲什麼要這樣做呢?這隻會增加我的開銷。如果經理管理一個隊列,至少讓我看看它有多長,或者例如提供類似'allFinished'的信號。 – Dennis

+0

假設我用一些請求發起了一些請求。 'manager.get(request)',而不明確地獲取或保留對返回答覆的引用。連接到'manager.finished'信號的插槽仍將獲得相應的回覆實例。這是否意味着經理已經保留了對答覆的引用? – Dennis

+0

是的,在這種情況下,*就是我所說的。但是,如果Qt必須保持一個參考值,直到它向用戶提交答覆爲止,這並不意味着它可以「平凡」地給我一個等待答覆的數量的計數完成?這就是我所要求的。順便說一句,謝謝你的善意幫助。 – Dennis

回答

1

Qt不提供訪問QNetworkAccessManager內部緩存的方法。

QNetworkReply API提供一個相對簡單的方式來監控回覆的狀態,但也不需要用戶來管理的答覆自我,不斷的什麼已經要求VS什麼已經收到了提示。

QNetworkAccessManager.finished()信號是不需要個別答覆的管理髮射後不管API - 然而,當已收到所有答覆,告知用戶沒有相應的全局信號。

Qt的文檔是針對答辯對象的所有權有點誤導:

注意:請求完成後,它是 用戶在刪除QNetworkReply對象的責任適當的時候。

這給人的印象是Qt不維持回覆的所有權,但實際上QNetworkAccessManager使自己所有repiles的父母,所以這是不是這樣的。

鑑於所有答覆都有自己的經理作爲家長,所以在PyQt中有一個相對簡單的解決方案來檢查所有當前答覆的狀態。連接到經理的finished()信號可能包含這樣的代碼插槽:

def handle_finished(self, reply): 
    data = reply.readAll() 
    # do something with data... 
    reply.deleteLater() 
    if all(child.isFinished() for child in 
      reply.manager().findChildren(QtNetwork.QNetworkReply)): 
     print('all finished') 
相關問題