Developpez.com - Qt
X

Choisissez d'abord la catégorieensuite la rubrique :

Viadeo Twitter Facebook Share on Google+   
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

Le support des threads dans les modules Qt

Les threads ne sont pas uniformément supportés dans tous les modules de Qt.

Les threads et le module SQL

Une connexion ne peut être utilisée qu'à partir du thread qui l'a créé. Déplacer des connexions entre des threads ou créer des requêtes à partir d'un thread différent n'est pas supporté.

De plus, les bibliothèques tierces utilisées par QSqlDrivers peuvent imposer des restrictions supplémentaires dans le cadre d'un programme multi-threads utilisant le module SQL. Consultez le manuel du client de votre base de données pour plus d'informations.

Peindre dans des threads

QPainter peut être utilisé dans un thread pour peindre sur les dispositifs de peinture QImage, QPrinter et QPicture. Peindre sur des QPixmap et QWidget n'est pas supporté. Sous Mac OS X, la boîte de dialogue de progression automatique ne sera pas affichée si vous êtes en train d'imprimer depuis un thread extérieur au thread de l'interface.

Plusieurs threads peuvent peindre simultanément. Cependant, un seul thread à la fois peut peindre sur un dispositif de peinture donné. En d'autres termes, deux threads peuvent peindre au même moment si chacun peint sur des objets QImage distincts, mais les deux threads ne peuvent pas peindre sur le même objet QImage en même temps.

Il faut noter que, sur les systèmes X11 qui ne supportent pas FontConfig, Qt ne peut pas afficher le texte en dehors du thread de l'interface. Vous pouvez utiliser la fonction QFontDatabase::supportsThreadedFontRendering() pour détecter si le rendu de police peut être utilisé en dehors du thread de l'interface ou pas.

Les threads et le traitement de texte riche

QTextDocument, QTextCursor, et toutes les classes liées sont ré-entrantes(1).

Notez qu'une instance de QTextDocument créée dans le thread de l'interface peut contenir des ressources d'image QPixmap. Utilisez QTextDocument::clone() pour créer une copie du document, et passez la copie à un autre thread pour réaliser un autre traitement (comme une impression).

Les threads et le module SVG

Les classes QSvgGenerator et QSvgRenderer dans le module QtSvg sont ré-entrantes.

Les threads et les classes partagées implicitement

Qt utilise une optimisation appelée partage implicite pour de nombreuses classes de valeur, en particulier QImage et QString. Dès Qt 4, les classes partagées implicitement peuvent être copiées de façon sûre d'un thread à un autre, comme n'importe quelle classe de valeurs. Elles sont totalement ré-entrantes. Le partage implicite est réellement implicite.

Dans l'esprit des gens, le partage implicite et le multi-threading ne sont pas des concepts compatibles à cause de la façon dont le comptage de référence est en général effectué. Cependant, Qt utilise un comptage de référence atomique pour assurer l'intégrité des données partagées, évitant ainsi les corruptions potentielles du compteur de référence.

Notez que le comptage atomique des références ne garantit pas que le programme soit thread-safe(2). Un verrouillage approprié doit être utilisé lors du partage entre plusieurs threads d'une instance de classe partagée implicitement. C'est la même condition appliquée à toutes les classes ré-entrantes, partagées ou non. Le comptage de référence atomique peut, cependant, garantir qu'un thread travaillant sur sa propre instance locale d'une classe partagée est sûr. Comme cela peut être réalisé sans aucun verrouillage explicite, nous recommandons d'utiliser les signaux et les slots pour passer des données à travers des threads.

Pour résumer, les classes partagées implicitement dans Qt 4 sont réellement partagées implicitement. Même dans les applications avec plusieurs threads, vous pouvez les utiliser de façon sûre, comme si elles étaient de simples classes à base de valeur, non-partagées et ré-entrantes.

Remerciements

Merci à Florent Renault pour la traduction, à Jonathan Courtois, à Thibaut Cuvelier ainsi qu'à Philippe Beaucart pour leur relecture !


(1)Une fonction ou un objet est dit ré-entrant quand il peut être utilisé simultanément par plusieurs threads, en considérant son implémentation et son interface externe.
(2)Une fonction ou un objet est dit thread-safe quand il peut être utilisé simultanément par plusieurs threads, en considérant uniquement son implémentation.

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt 4.7
Copyright © 2018 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur, une redirection cassée ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
Responsable bénévole de la rubrique Qt : Thibaut Cuvelier -