QThread blockierende Hauptanwendung

8

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.

    
Atilla Filiz 09.07.2010, 14:47
quelle

3 Antworten

27

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

  1. QThread selbst ist kein Thread. Es ist nur ein Wrapper um einen Thread, das bringt uns zu ..
  2. Signale / Slots, die in der Klasse 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 .

    
Casey 09.07.2010, 15:15
quelle
4

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)

    
Kamil Klimek 09.07.2010 14:58
quelle
-1

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.

    
Abhishek 11.07.2010 03:02
quelle

Tags und Links