有没有办法获取有关QNetworkAccessManager队列的信息?

时间:2017-08-31 18:32:02

标签: qt pyqt queue pyside qnetworkaccessmanager

来自Qt 4 docs

  

注意:QNetworkAccessManager将收到的请求排队。

现在,我希望能够做两件事(使用PyQt):

  1. 检查QNetworkAccessManager的“内部”队列中有多少请求,等待发送。
  2. 检查已收到答复的请求数(即已完成的QNetworkReplies的计数)。
  3. 我认为此信息必须已在内部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信号会为我节省几行代码。

1 个答案:

答案 0 :(得分:2)

Qt没有提供访问QNetworkAccessManager内部缓存的方法。

QNetworkReply API提供了一种监控回复状态的相对简单的方法,但这确实需要用户自己管理回复并记录所请求的内容 vs 已经收到了什么。

QNetworkAccessManager.finished()信号是一种即发即弃的API,不需要管理各个回复 - 但是,没有相应的全局信号在全部时通知用户已收到回复。

Qt文档在回复对象的所有权方面有些误导:

  

注意:请求完成后,由...负责   用户在适当的时间删除QNetworkReply对象。

这给人的印象是Qt没有维护回复的所有权,但事实上QNetworkAccessManager使自己成为其所有复制的父级,所以情况并非如此。

鉴于所有回复都将其经理作为父级,因此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')