Ich habe eine einfache Formular-Benutzeroberfläche, die einen Platz für eine Schaltfläche hat und einen Thread startet:
%Vor%Und die Methode run () sieht folgendermaßen aus:
%Vor%Wenn ich auf die Schaltfläche klicke, die LoadImage () aufruft, reagiert die Benutzeroberfläche nicht mehr. Ich sehe regelmäßig die "Ping" Nachricht als Debug-Ausgabe, aber die UI hängt, reagiert auf nichts. Warum wird mein Thread nicht separat ausgeführt? CameraThread wurde als öffentlicher QThread abgeleitet Ich benutze gcc Version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) mit QT Bibliotheken und QT Creator von Ubuntu 10.04 (x86) Repositories.
Kurze Antwort: Starten Sie Ihren Thread, indem Sie aThread->start();
nicht run()
aufrufen und sicherstellen, dass die run () -Methode des Threads geschützt (nicht öffentlich) ist.
Erläuterung
Der Aufruf von start()
ist der richtige Weg , um den Thread zu starten, da er Priorität bietet Scheduling und führt die Methode run()
in ihrem eigenen Thread-Kontext tatsächlich aus.
Es sieht so aus, als würdest du Bilder in diesen Thread laden, also werde ich ein paar Tipps geben, bevor du auf Fallgruben triffst, in die viele Leute fallen, wenn sie QThread benutzen
CameraThread
definiert sind, werden nicht unbedingt im Kontext des Threads ausgeführt , denken Sie daran, dass nur die Methode run () und die davon aufgerufenen Methoden in einem separaten Thread ausgeführt werden. IMHO, Unterklasse QThread in der Mehrheit Fälle ist nicht der Weg zu gehen. Sie können es viel einfacher mit dem folgenden Code machen, und es wird Ihnen viele Kopfschmerzen ersparen.
%Vor%Lesen Sie auch den Qt-Blog zu diesem Thema .
Sie müssen thread- & gt; start () nicht ausführen ... run ist ein Einstiegspunkt für thread. Der Thread wird mit Start gestartet. Du rufst direkt an, deshalb blockierst du deine GUI. Überprüfen Sie die Dokumentation von QThread. virtual void QThread :: run () ist geschützt (nicht ohne Grund)
Ich denke, das Problem könnte sein, dass Sie QtCore.QThread._init __ (self) im Konstruktor nicht aufrufen. Ich hatte das gleiche Problem. Ich denke auch, dass Sie die Startfunktion nicht überschreiben sollten, überschreiben Sie einfach die Funktion run (). Dies löste das gleiche Problem, das ich hatte. Auch ohne Verzögerungen () sollte das Fenster reagieren.
Tags und Links c++ qt multithreading qthread