Evgenii Legotckoi
Evgenii Legotckoi7. April 2016 13:05

Qt/C++ - Lektion 046. QThread - Einführung

GUI-Thread und Worker-Thread

Jedes Programm hat beim Start einen Thread. Dieser Thread wird in Qt-Anwendungen Hauptthread oder GUI-Thread genannt. Die Qt-GUI muss auf dem angegebenen Thread ausgeführt werden. Alle Widgets und einige ähnliche Klassen wie QPixmap funktionieren nicht in sekundären Threads. Ein sekundärer Thread wird normalerweise als Worker-Thread bezeichnet, der den Haupt-Thread des Programms entlasten soll.

Gleichzeitiger Zugriff auf Daten

Wenn zwei Threads einen Zeiger auf ein Objekt haben, können beide Threads irgendwann auf dieses Objekt zugreifen, was die Integrität des Objekts zerstören kann. Es ist notwendig, den gleichzeitigen Zugriff auf ein Objekt von verschiedenen Threads aus zu verhindern.


Anwendungsfälle

Es gibt zwei Hauptanwendungsfälle für Threads:

  • Beschleunigung der Anwendung durch mehrere Computerprozessoren;
  • Halten Sie die GUI für den Benutzer reaktionsfähig, wenn Prozesse lange laufen, die dazu führen können, dass die GUI der Anwendung blockiert.

Wann Thread-Alternativen verwendet werden sollten

Bevor Sie einen Thread erstellen, überlegen Sie, ob es nicht möglich ist, das Problem auf alternative Weise zu lösen.

Alternative Beschreibung
QEventLoop::processEvents() Das mehrmalige Aufrufen von QEventLoop::processEvents() während der Berechnung der Zeitkosten verhindert, dass die GUI abstürzt. Diese Lösung lässt sich jedoch nicht gut skalieren, da processEvents() je nach Hardwareplattform des Computers zu häufig oder zu selten aufgerufen werden kann oder nicht.
QSocketNotifier QNetworkAccessManager QIODevice::readyRead() Diese alternative Lösung hat sowohl einzelne als auch mehrere Threads, jeweils mit einer Lesesperre bei langsamen Verbindungen. Solange die Operationen für die Antwort schnell abgeschlossen werden können, ist dieses Design möglicherweise besser als die Verwendung zusätzlicher Threads. Dieses Design weist weniger Fehler auf und ist energieeffizienter als Streams. In vielen Fällen gibt es auch eine Leistungssteigerung.
QTimer Hintergrundprozesse können manchmal mit einem Timer ausgeführt werden, um nach einem Zeitplan ausgeführt zu werden. Beispielsweise wird ein gewisser Code mit einer gewissen Häufigkeit in einem speziellen Slot des Objekts ausgeführt. Ein Timer mit einem Wert von 0 wird immer dann ausgelöst, wenn keine anderen Thread-Ereignisse im Prozess vorhanden sind.

Arten von Qt-Threads (QThread)

Thread-Lebenszyklus Entwicklungsaufgabe Lösung
Ein Anruf Ausführen einer Methode in einem anderen Thread und Beenden des Threads, wenn die Methode abgeschlossen ist. Qt bietet verschiedene Lösungen: * Eine Funktion schreiben und mit QtConcurrent::run() ausführen
* Erben Sie eine Klasse von QRunnable und führen Sie sie in einem globalen Thread mit QThreadPool::globalInstance()->start() aus
* Eine Klasse von QThread ableiten, die Methode QThread::run() überschreiben und sie mit der Methode QThread::start() verwenden.
Ein Anruf Die lange laufende Operation muss in einem anderen Thread platziert werden, und das Ergebnis der Verarbeitung muss an den GUI-Thread gesendet werden. QThread wird verwendet, die Methode run() wird überschrieben und bei Bedarf wird ein Signal aufgerufen. Verbinden eines Signals mit dem GUI-Slot eines Threads unter Verwendung einer Warteschlange von Signal- und Slot-Verbindungen.
Ein Anruf Operationen müssen für alle Objekte aus der Liste durchgeführt werden. Die Verarbeitung muss unter Verwendung aller verfügbaren Kerne erfolgen. Ein typisches Beispiel ist das Zeichnen von Miniaturansichten von Bildern in einer Liste. QtConcurrent stellt eine map() -Methode bereit, mit der Operationen für jedes Element ausgeführt werden können, filter() gibt die Elemente der Liste an, auf die Operationen angewendet werden.
Dauerhaft Es gibt ein Objekt, das in einem anderen Thread lebt und verschiedene Aufgaben auf Anfragen ausführt. Dies bedeutet, dass eine gewisse Kommunikation mit dem angegebenen Objekt erforderlich ist und ein Worker-Thread erforderlich ist. Erben einer Klasse von QObject und Einfügen der erforderlichen Signale und Slots, Übergeben des Objekts an den Thread mit dem Start der Ereignisschleife und Kommunizieren mit dem Objekt über die Signal-/Slot-Warteschlange.
Dauerhaft Es gibt ein Objekt, das in einem anderen Thread lebt und sich wiederholende Aufgaben ausführt. Es sieht aus wie ein Timer und auch die Verwendung von Signalen und Slots könnte funktionieren, aber es ist am besten, diesen Ansatz zu vermeiden. Beispiel: QSocketNotifier.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken