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 kann mit QSqlDatabase::moveToThread() durchgeführt werden.
Zusätzlich können die Bibliotheken von Drittanbietern, die von den QSqlDrivers verwendet werden, weitere Einschränkungen für die Verwendung des SQL-Moduls in einem Multithread-Programm auferlegen. Konsultieren Sie das Handbuch Ihres Datenbankclients für weitere Informationen
Zeichnen in Threads
QPainter kann in einem Thread verwendet werden, um auf QImage, QPrinter, QPicture und (für die meisten Plattformen) QPixmap zu zeichnen. Malen auf QWidgets wird nicht unterstützt. Unter macOS wird der automatische Fortschrittsdialog nicht angezeigt, wenn Sie von außerhalb des GUI-Threads drucken.
Eine beliebige Anzahl von Threads kann zu jeder Zeit malen, jedoch kann nur ein Thread zur gleichen Zeit auf ein bestimmtes Malgerät malen. Mit anderen Worten, zwei Threads können gleichzeitig malen, wenn jeder auf separate QImages malt, aber die beiden Threads können nicht gleichzeitig auf dieselbe QImage malen.
Threads und Rich-Text-Verarbeitung
Die Klassen QTextDocument, QTextCursor und alle verwandten Klassen sind reentrant.
Beachten Sie, dass eine QTextDocument Instanz, die im GUI Thread erstellt wurde, QPixmap Bildressourcen enthalten kann. Verwenden Sie QTextDocument::clone(), um eine Kopie des Dokuments zu erstellen, und übergeben Sie die Kopie an einen anderen Thread zur weiteren Verarbeitung (z. B. Drucken).
Threads und das SVG-Modul
Die Klassen QSvgGenerator und QSvgRenderer im Modul QtSvg sind reentrant.
Threads und implizit gemeinsam genutzte Klassen
Qt verwendet eine Optimierung namens implizite gemeinsame Nutzung für viele seiner Value-Klassen, insbesondere QImage und QString. Seit Qt 4 können implizit gemeinsam genutzte Klassen sicher über Threads hinweg kopiert werden, wie alle anderen Wertklassen auch. Sie sind vollständig reentrant. Die implizite gemeinsame Nutzung ist wirklich implizit.
In den Köpfen vieler Leute sind implizite gemeinsame Nutzung und Multithreading unvereinbare Konzepte, wegen der Art und Weise, wie die Referenzzählung normalerweise durchgeführt wird. Qt verwendet jedoch atomare Referenzzählung, um die Integrität der gemeinsam genutzten Daten zu gewährleisten und eine mögliche Verfälschung des Referenzzählers zu vermeiden.
Beachten Sie, dass die atomare Referenzzählung keine Thread-Sicherheit garantiert. Wenn eine Instanz einer implizit gemeinsam genutzten Klasse zwischen Threads geteilt wird, sollte ein geeignetes Locking verwendet werden. Dies ist die gleiche Anforderung, die an alle reentranten Klassen gestellt wird, ob gemeinsam genutzt oder nicht. Die atomare Referenzzählung garantiert jedoch, dass ein Thread, der an seiner eigenen, lokalen Instanz einer implizit gemeinsam genutzten Klasse arbeitet, sicher ist. Wir empfehlen die Verwendung von Signalen und Slots, um Daten zwischen Threads zu übertragen, da dies ohne explizites Locking möglich ist.
Zusammenfassend lässt sich sagen, dass implizit freigegebene Klassen in Qt 4 wirklich implizit freigegeben sind. Sogar in Multithread-Anwendungen können Sie sie sicher verwenden, als wären sie einfache, nicht gemeinsam genutzte, reentrant wertbasierte Klassen.
© 2025 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.