Wie man einen QThread von der GUI aus anhält

8

Dies ist eine Follow-up-Frage zu einer früheren, die ich zuvor gepostet habe. Das Problem besteht darin, wie man ein QThread von der GUI aus stoppt (beendet | beendet | beendet), wenn man die empfohlene Methode, Qthread NICHT zu untergliedern, verwendet, sondern ein QObject erschafft und es dann zu einem QThread verschiebt. Unten, wenn ein funktionierendes Beispiel. Ich kann die GUI und den Qthread starten und ich kann letztere die GUI aktualisieren lassen. Ich kann es jedoch nicht stoppen. Ich habe mehrere Methoden für qthread (quit (), exit () und sogar terminieren ()) vergeblich versucht. Hilfe sehr geschätzt.

Hier ist der vollständige Code:

%Vor%     
stefano 26.04.2013, 23:50
quelle

2 Antworten

3

Ich fand heraus, dass meine ursprüngliche Frage eigentlich zwei Fragen in einem war: Um einen sekundären Thread vom Hauptthema abzuhalten, braucht man zwei Dinge:

  1. Sie können vom Hauptthread down zum sekundären Thread

  2. kommunizieren
  3. Senden Sie das richtige Signal, um den Thread zu stoppen

Ich konnte nicht lösen (2), aber ich habe herausgefunden, wie man (1) löst, was mir einen Workaround zu meinem ursprünglichen Problem gab. Anstatt den Thread anzuhalten, kann ich die Verarbeitung des Threads stoppen (die Methode longRunning() )

Das Problem ist, dass ein sekundärer Thread nur auf Signale reagieren kann, wenn er eine eigene Ereignisschleife ausführt. Ein regulärer Qthread (was mein Code verwendet hat) nicht. Es ist jedoch leicht genug, QThread zu diesem Effekt zu untergliedern:

%Vor%

und verwendet self.simulThread = MyThread() in meinem Code anstelle des ursprünglichen self.simulThread = Qthread() . Dadurch wird sichergestellt, dass der sekundäre Thread eine Ereignisschleife ausführt. Das war jedoch nicht genug. Die Methode longRunning() muss eine Chance haben, das Ereignis, das vom Hauptthread kommt, tatsächlich zu verarbeiten. Mit Hilfe von diese SO-Antwort Ich fand heraus, dass das einfache Hinzufügen von QApplication.processEvent() in der longRunning() -Methode dem sekundären Thread eine solche Chance gab. Ich kann jetzt die Verarbeitung stoppen, die im sekundären Thread ausgeführt wurde, obwohl ich nicht herausgefunden habe, wie ich den Thread selbst stoppen kann.

Zum Schluss. Meine longRunning-Methode sieht jetzt so aus:

%Vor%

und mein GUI-Thread hat diese drei Zeilen, die den Job erledigen (zusätzlich zu der oben aufgeführten QThread-Unterklasse):

%Vor%

Kommentare sind willkommen!

    
stefano 29.04.2013, 15:31
quelle
6

Ich weiß es schon lange, aber ich bin gerade über das gleiche Problem gestolpert.

Ich habe auch nach einem geeigneten Weg gesucht, dies zu tun. Endlich war es einfach. Beim Beenden der Anwendung muss die Aufgabe gestoppt werden und der Thread muss gestoppt werden, indem die Methode quit aufgerufen wird. Siehe stop_thread-Methode unten. Und Sie müssen warten, bis der Thread beendet ist. Andernfalls erhalten Sie QThread: Zerstört, während der Thread noch läuft 'Nachricht beim Beenden .

(Ich habe auch meinen Code geändert, um pyside zu verwenden)

%Vor%     
maggie 21.08.2015 10:36
quelle

Tags und Links