Threading zur Echtzeitdarstellung von Berechnungen / Ergebnissen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Squipy
User
Beiträge: 39
Registriert: Sonntag 30. Juni 2019, 16:42

Moin Zusammen,

ich habe ein Tool geschrieben welches diverse Berechnungen durchführt, die Ergebnisse lasse ich mittel PyQt5 mit Hauptfenster darstellen. Damit das auch während der Berechnung funktioniert, verwende ich gerade die _thread libary.
Das Hauptfenster welches ich mit dem QTDesigner erstellt habe enthält einen Textbrowser um kontinuierlich einen Status zu geben (bspw."'Berechnung von Blabla noch blabla Files"). Zudem enthält das Fenster ein QWidget welches ich mit der Klasse "PlotWidget" promoted habe um mir pyqt plots darstellen zu lassen (graphWIdget). Und da scheint auch das Problem zu liegen:
Der Aufbau des Codes ist in etwa so, dass ich mittels des ui readers das Dialogfenster öffne und starte und dieser nun wartet bis ich start drücke und dann die Funktion any_function() mit einem neuem Thread startet. Der Funktion wird der QTDialog ("d_mainWindow" ) übergben, damit ich in der Funktion den Status in den TextBrowser sowie den Plot aktualisieren kann.

Code: Alles auswählen

def start_main_window():
     
    raw_data_dir = d_mainWindow.rawDataDir.text()     
    dir_output = d_mainWindow.dirOutput.text()    
    
    _thread.start_new_thread(any_function,(raw_data_dir,dir_output, d_mainWindow))

        
app = widgets.QApplication(sys.argv)
d_mainWindow = uic.loadUi(r"VA_Binning_GUI.ui")

d_mainWindow.show()
d_mainWindow.graphWidget.setLabel('top','Measurement Data Overview',labelStyle = {'color': 'black', 'font-size': '18pt'})

d_mainWindow.startButton.clicked.connect(start_main_window)

sys.exit(app.exec())
Offensichtlich scheint QT aber ein problem damit zu haben, den Plot mit einem neuen Thread zu aktualisieren, weil ich regelmäßig die Warnmeldung bekomme:

Code: Alles auswählen

QObject::startTimer: Timers cannot be started from another thread
Und das Programm schmiert leider auch gerne mal ab und ich vermute, dass meine wohl amateurmäßige threading anwendung daran schuld ist.

Für jede/n Kritik und Verbesserungsvorschlag bin ich sehr dankbar!

Squipy
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Verwende QThread.
Ein Unterstrich deutet in Python darauf hin, dass man das nicht benutzen sollte.

Für alle GUIs gilt: Außerhalb des Main-Event-Loops (also des Hauptthreads) darf die GUI nicht manipuliert werden.
In QT kannst du Signale (Signals) verwenden, um uas einem QThread heraus mit dem Hauptthread zu kommunizieren.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Modul _thread ist ein Implementierungsdetail und sollte niemals in Code direkt verwandt werden. Unabhaengig von Qt.

Dann sind GUIs und Threads grundsaetzlich ein Problem. Es ist nicht moeglich, aus mehreren Threads GUI-Elemente zu manipulieren. Das fuehrt eben zu Abstuerzen und komischem Fehlverhalten. In Qt sollte man daher die entsprechenden Abstraktionen und Rezepte nutzen. Hier viewtopic.php?f=24&t=44250&start=15#p335559 habe ich mal ein Beispiel geschrieben, das die richtigen Vorgehensweisen beinhaltet. Daran kannst du mal versuchen dich langzuhangeln.
Antworten