2017-08-31 4 views
1

De l'Qt 4 docs:Existe-t-il un moyen d'obtenir des informations sur la file d'attente QNetworkAccessManager?

Note: QNetworkAccessManager files d'attente les requêtes qu'il reçoit.

Maintenant, il y a deux choses que je voudrais pouvoir faire (en utilisant PyQt):

  1. Vérifiez le nombre de requêtes dans la file d'attente « interne » de QNetworkAccessManager, en attente d'envoi .
  2. Vérifiez le nombre de demandes ayant reçu une réponse (c'est-à-dire le nombre de réponses QNetworkReplies terminées).

Je suppose que cette information doit déjà être disponible pour le QNetworkAccessManager en interne, mais je n'ai pas réussi à trouver un moyen d'y accéder. Je ne pouvais rien trouver dans les documents Qt ou ailleurs, mais peut-être que je cherche au mauvais endroit ou en utilisant la mauvaise terminologie. Est-ce que quelqu'un peut me dire si Qt fournit un moyen d'accéder à l'information sur la file d'attente QNetworkAccessManager? Pour plus de clarté: je peux penser à quelques façons de garder une trace de ces choses moi-même, par exemple. en vérifiant les états QNetworkReply individuels, mais ce n'est pas le genre de solution que je cherche (seulement en dernier recours, si Qt ne fournit pas un moyen plus simple).

--- EDIT ---

Un exemple légèrement moins que minimal mais toujours trivial du genre de chose que j'avais en tête:

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_() 

Dans ce cas quelque chose comme un allFinished le signal du gestionnaire me permettrait d'économiser quelques lignes de code.

+0

Pour moi, il semble comme une * très * API probable pour Qt de fournir. "QNetworkReply" est effectivement cette API "seulement si je fais une comptabilité supplémentaire. Je sais que c'est facile à réaliser, mais pourquoi le faire moi-même si l'information doit déjà être là? Cela ne fait qu'ajouter à mes frais généraux. Si le gestionnaire gère une file d'attente, laissez-moi au moins voir combien de temps il est, par exemple. fournir quelque chose comme un signal 'allFinished'. – Dennis

+0

Supposons que je tire une ou deux requêtes en utilisant, par exemple, 'manager.get (request)', sans obtenir explicitement ou conserver une référence à la réponse renvoyée. Un emplacement connecté au signal 'manager.finished' obtiendra toujours les instances de réponse correspondantes. Cela ne signifie-t-il pas que le gestionnaire conserve déjà des références aux réponses? – Dennis

+0

Oui, dans ce cas, c'est * ce que je dis. Mais, s'il est «trivialement vrai que Qt doit conserver une référence jusqu'au moment où il donne la réponse à l'utilisateur», cela ne signifie-t-il pas qu'il pourrait aussi «trivialement» me donner le nombre de réponses en attente? d'être fini? C'est tout ce que je demande. Btw merci pour votre aide aimable. – Dennis

Répondre

1

Qt ne fournit pas un moyen d'accéder au cache interne QNetworkAccessManager.

Les QNetworkReply API fournissent un moyen relativement simple de surveiller l'état des réponses, mais qui ne nécessite que l'utilisateur de gérer les réponses elles-mêmes et garder un décompte de ce qui a été demandé vs ce qui a été reçu.

Le signal QNetworkAccessManager.finished() est un feu et oublier API qui ne nécessite pas la gestion des réponses individuelles - cependant, il n'y a pas de signal global correspondant qui informe l'utilisateur lorsque toutes réponses ont été reçues.

Les docs Qt sont quelque peu trompeurs quant à la propriété des objets de réponse:

Remarque: Une fois la demande terminée, il est de la responsabilité de l'utilisateur pour supprimer l'objet QNetworkReply à un temps voulu.

Cela donne l'impression que Qt ne conserve pas la propriété des réponses, mais en fait le QNetworkAccessManager se fait mère de tous ses repiles, de sorte que ce n'est pas le cas. Etant donné que toutes les réponses ont leur gestionnaire en tant que parent, il existe une solution relativement simple disponible dans PyQt pour vérifier l'état de toutes les réponses actuelles. La fente reliée au signal finished() du gestionnaire pourrait contenir du code comme ceci:

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')