2010-02-25 3 views
0

Je suis nouveau sur QT. J'ai créé la fenêtre principale de la classe d'objet QNetworkAccessManager en tant que parent. Aussi enregistré à SIGNAL fini. Cela fonctionne bien. Mais je veux savoir dans quel thread il va fonctionner. Va-t-il bloquer le thread principal. Si j'ai besoin d'effectuer une séquence d'opération, comment dois-je écrire le code? S'il vous plaît donnez-moi un échantillon pour comprendre correctement le concept.QNetworkAccessManager gérant le thread asynchrone

Répondre

2

Il ne fonctionne certainement pas dans le thread principal, les appels à get() sont asynchrones.

Par exemple, ce serait continuer à tirer les requêtes GET:

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

Vous avez alors la fente pour le signal fini qui est en train de traiter le QNetworkReply. Cet emplacement devrait être appelé pour chaque demande d'obtention que vous faites (même si elle échoue). Si vous avez besoin de garder une trace du moment où toutes vos demandes d'obtention sont terminées, vous devez garder une trace du nombre de messages que vous avez publiés et ensuite avoir votre propre drapeau ou signal fini.

+0

replay Merci. est la fente de finition se déroulera dans le fil principal? S'il s'exécute dans le thread principal, il bloquera le thread principal. Pour cela j'utilise un échantillon comme ci-dessous. ---- QNetworkAccessManager manager; QEventLoop q; QTimer tT; tT.setSingleShot (true); Connect (& tT, SIGNAL (timeout()), & q, SLOT (quitter())) Connect (& manager, SIGNAL (terminé (QNetworkReply *)), & q, SLOT (quit())) QNetworkReply * reply = manager.get (QNetworkRequest (QUrl ("URL"))); tT.start (5k); q.exec(); ------ Cette méthode est correcte. Je prévois d'exécuter le code ci-dessus dans le thread secondaire. Si je l'exécute dans un thread secondaire cela posera problème. –

0

QNAM utilise des threads en arrière-plan, mais cela est complètement invisible pour votre code d'application. Tout ce que vous verrez se déroulera dans le fil principal. QNAM fonctionne de la manière habituelle de Qt, il émet des signaux quand les choses arrivent, et vous connectez ces signaux aux slots de votre propre code, qui font tout ce qu'ils peuvent. Si par exemple ils n'ont pas assez de données, alors vos slots ne doivent pas bloquer pour attendre de nouvelles données, ils doivent plutôt retourner. Et puis ils seront appelés à nouveau quand/s'il y a plus de données (ou vous aurez un autre signal si par exemple la connexion a été interrompue).

Quelques liens, dans le cas où vous avez pas lu ces:

Questions connexes