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
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.
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:
- 1. VC++ - Thread asynchrone
- 2. Comment arrêter le thread asynchrone après 5 secondes de fonctionnement
- 3. Attendre que le thread principal s'arrête jusqu'à ce qu'une tâche soit traitée par un thread asynchrone
- 4. Qt Authentification HTTP avec QNetworkAccessManager
- 5. QNetworkAccessManager/QNetworkRépondez avec QTcpSocket personnalisé?
- 6. Spring @ExceptionHandler gérant plusieurs types d'exceptions
- 7. Fonction asynchrone - rappel utilisant un objet appartenant au thread principal
- 8. Demande asynchrone au serveur à partir du thread d'arrière-plan
- 9. C: modèle pour renvoyer l'erreur asynchrone du thread d'arrière-plan?
- 10. Comment faire thread non bloquant asynchrone FACEBOOK dans Android
- 11. WCF - à partir d'un nouveau thread de manière asynchrone
- 12. Suppression de 'QNetworkReply *' renvoyée par QNetworkAccessManager :: post
- 13. Qt QNetworkAccessManager n'émet pas de signaux
- 14. Authentification de base avec Qt (QNetworkAccessManager)
- 15. iphone charger le fichier asynchrone?
- 16. process.WaitForExit() asynchrone
- 17. Comment importer le module asynchrone Python à partir d'un thread de travail?
- 18. quel sens asynchrone IO faire si le thread est bloqué quand même (voir exemple)
- 19. ReadDirectoryChangesW asynchrone()?
- 20. programmation asynchrone
- 21. Solution de forum (asp.net C#) gérant l'authentification Windows
- 22. rails gérant des objets retournés simples et multiples
- 23. Invoke fonction dans le nouveau thread PowerShell
- 24. Le nouveau thread bloque toujours l'UI-Thread
- 25. Invocation asynchrone WS
- 26. C# Thread in Thread: comment obtenir SynchronizationContext.Current?
- 27. Temporisation de tâche asynchrone?
- 28. Comment gérer les proxies lors de l'utilisation de QNetworkAccessManager
- 29. Envoyer des informations d'en-tête HTTP avec Qt QNetworkAccessManager
- 30. Java méthode asynchrone appel
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. –