IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

QNetworkAccessManager fonctionnera de manière threadée dès Qt 4.8
Améliorant les performances de QtWebKit sans y toucher

Le , par Michel Rotta

49PARTAGES

1  0 
Depuis quelque temps nous avons intégré un changement dans QNetworkAccessManager qui permet de traiter les requêtes HTTP dans un thread séparé. Vous avez demandé de d'expliquer ce fonctionnement, ce qui est fait ici !

La raison sous-jacente à ce traitement est le fonctionnement de QtWebKit (basé sur WebKit 1). Un explorateur a généralement beaucoup de travail à faire. Il doit analyser le HTML et le CSS, décoder les images JPEG ou PNG en quelque chose qui peut être affiché, générer l’affichage de la page, réagir aux actions de l'utilisateur et exécuter tout le JavaScript du gentil monde du Web 2.0 (à moins que nous ne soyons déjà arrivé au Web 3.0 ?).

Pendant que tout ce travail est en cours, les tâches réseau ne progressent pas si elles s'exécutent dans le même thread que le reste du navigateur. Nous avons constaté, à partir des traces réseau, qu'il se produit ce qu'on appelle des "points de synchronisation" : tandis que QtWebKit est occupé a traiter le thread principal et donc bloque sa boucle de traitement des événements, aucune nouvelle demande n'est envoyée au réseau. Ce qui entraine que, dans le pire des cas, les serveurs HTTP cessent d'envoyer de nouvelles données. C'est particulièrement vrai quant vous avez de faibles capacités de traitement et que la latence réseau est plus élevée que sur le PC de bureau classique (salut le monde des mobile !).

Il y a plusieurs solutions à ça :
  • mettre QtWebKit dans un thread et laisser la gestion de réseau dans le thread utilisateur ;
  • mettre tout le QNetworkAccessManager dans un thread ;
  • mettre le traitement du code HTTP de QNetworkAccessManager dans un thread.


Nous avons adopté la troisième solution.

Techniquement, ceci fonctionne en ajoutant une couche à l'intérieur de QNetworkAccessManager. Le code actuel du protocole de HTTP ne change absolument pas, seule la méthode utilisée par QNetworkAccessManager change. Ainsi, votre code et celui de QtWebKit n'ont pas besoin de modification. Cette technique, disponible à partir de la version 4.8, donne ces avantages sans nécessiter d'activer quoi que ce soit de spécial.

Si vous voulez d'ores et déjà l'utiliser, veuillez jeter un coup d'œil au dépôt de l'équipe terre et pensez à rapporter les bogues . Si vous voulez jeter un coup d'œil au code, une nouvelle classe (interne) existe dans QHttpThreadDelegate (qui existe dans le thread HTTP) et contrôle le code HTTP. Il est piloté par QNetworkAccessHttpBackend (interne) (dans le thread utilisateur) via des signaux et des slots.

PS : beaucoup de choses se produisent à l'intérieur de l'équipe Qt ces jours-ci et vont continuer à se produire, quoique les bruis qui courent indiquent autre chose… Tandis que vous lisez ceci, nous rendons l'utilisation de QtWebKit encore plus asynchrone grâce au "WebKit2 power" !

Source : http://labs.qt.nokia.com/2011/04/29/...accessmanager/

Une erreur dans cette actualité ? Signalez-nous-la !