Thread-Unterstützung in Qt-Modulen
Threads und das SQL-Modul
Eine Datenbankverbindung darf nur innerhalb des Threads verwendet werden, der sie erstellt hat. Das Verschieben einer Verbindung in einen anderen Thread ist mit ` QSqlDatabase::moveToThread()` möglich.
Darüber hinaus können die von den QSqlDrivers verwendeten Bibliotheken von Drittanbietern weitere Einschränkungen für die Verwendung des SQL-Moduls in einem Multithread-Programm auferlegen. Weitere Informationen finden Sie im Handbuch Ihres Datenbank-Clients
Zeichnen in Threads
QPainter kann in einem Thread verwendet werden, um auf die Zeichenobjekte ` QImage`, ` QPrinter`, ` QPicture` und (auf den meisten Plattformen) ` QPixmap ` zu zeichnen. Das Zeichnen auf `QWidgets` wird nicht unterstützt. Unter macOS wird der automatische Fortschrittsdialog nicht angezeigt, wenn Sie von außerhalb des GUI-Threads drucken.
Es können zu jedem Zeitpunkt beliebig viele Threads zeichnen, jedoch kann jeweils nur ein Thread auf ein bestimmtes Zeichenobjekt zeichnen. Mit anderen Worten: Zwei Threads können gleichzeitig zeichnen, wenn jeder auf ein separates `QImage` zeichnet, aber die beiden Threads können nicht gleichzeitig auf dasselbe ` QImage ` zeichnen.
Threads und Rich-Text-Verarbeitung
Die Klassen „ QTextDocument “, „ QTextCursor “ und alle damit verbundenen Klassen sind reentrant.
Beachten Sie, dass eine im GUI-Thread erstellte QTextDocument -Instanz möglicherweise QPixmap -Bildressourcen enthält. Verwenden Sie QTextDocument::clone() , um eine Kopie des Dokuments zu erstellen, und übergeben Sie die Kopie zur weiteren Verarbeitung (z. B. zum Drucken) an einen anderen Thread.
Threads und das SVG-Modul
Die Klassen ` QSvgGenerator ` und ` QSvgRenderer ` im Modul ` QtSvg ` sind reentrant.
Threads und implizit gemeinsam genutzte Klassen
Qt nutzt für viele seiner Wertklassen eine Optimierung namens „implizite Freigabe“, insbesondere für ` QImage ` und ` QString`. Ab Qt 4 können implizit freigegebene Klassen wie jede andere Wertklasse sicher zwischen Threads kopiert werden. Sie sind vollständig reentrant. Die implizite Freigabe ist tatsächlich implizit.
In der Vorstellung vieler Menschen sind implizites Teilen und Multithreading unvereinbare Konzepte, was an der Art und Weise liegt, wie die Referenzzählung typischerweise erfolgt. Qt verwendet jedoch atomare Referenzzählung, um die Integrität der gemeinsam genutzten Daten zu gewährleisten und eine mögliche Beschädigung des Referenzzählers zu vermeiden.
Beachten Sie, dass die atomare Referenzzählung keine Thread-Sicherheit garantiert. Bei der gemeinsamen Nutzung einer Instanz einer implizit gemeinsam genutzten Klasse durch mehrere Threads sollte eine ordnungsgemäße Verriegelung verwendet werden. Dies ist dieselbe Anforderung, die an alle reentranten Klassen gestellt wird, unabhängig davon, ob sie gemeinsam genutzt werden oder nicht. Die atomare Referenzzählung garantiert jedoch, dass ein Thread, der mit seiner eigenen, lokalen Instanz einer implizit gemeinsam genutzten Klasse arbeitet, sicher ist. Wir empfehlen die Verwendung von Signalen und Slots zur Datenübergabe zwischen Threads, da dies ohne explizite Sperren erfolgen kann.
Zusammenfassend lässt sich sagen, dass implizit gemeinsam genutzte Klassen in Qt 4 tatsächlich implizit gemeinsam genutzt werden. Selbst in Multithread-Anwendungen können Sie sie sicher so verwenden, als wären sie einfache, nicht gemeinsam genutzte, reentrante, wertbasierte Klassen.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.