GUI friert während Schleife ein: Thread hilft nicht?

Alles rund um die Programmierung mit Qt
pbooster2000
Beiträge: 10
Registriert: 25. November 2010 17:55

Beitrag von pbooster2000 »

solarix hat geschrieben:doch... das ist ein Problem.. und zwar nicht nur ein theoretisches, sondern ganz real. Im Grunde kannst du tun und lassen was du möchtest (wir können dir ja nichts verbieten), aber wehe du startest in ein paar Tagen ein Thread mit dem Topic "Hilfe: ich habe sporadische, nicht reproduzierbare Segfaults"...
Ich versuche ja nur zu verstehen, wie es funktioniert. Wenn ich mehrere Threads starte, könnte das zum Problem werden. Bei nur einem eigentlich nicht, wie ich finde. Warum ist das also deiner Meinung nach auch bei einem Thread schlecht und könnte zu SegFaults führen?

Danke!
dazedly
Beiträge: 197
Registriert: 3. Oktober 2010 15:38
Kontaktdaten:

Beitrag von dazedly »

Weil es genau genommen zwei Threads sind die am laufen sind. Deine Applikation und dein Thread, den du darüber startest.
pbooster2000
Beiträge: 10
Registriert: 25. November 2010 17:55

Beitrag von pbooster2000 »

Ok, dann versuche ich das zu verbessern. Danke soweit für die Hilfe!

Eine andere Frage, die sich mir in diesem Zusammenhang stellt: Wenn ich, während die große Schleife läuft, ein GUI Element ein Signal senden lasse, das an einen Slot im Worker-Thread connected ist, so dass im Worker-Thread eine Variable umgesetzt wird, so passiert es häufig, dass das Signal erst im Worker-Thread "erkannt" wird, wenn ein Schleifendurchlauf beendet ist.

Connect sieht bei mir so aus:

Code: Alles auswählen

	
connect(groupbox, SIGNAL(clicked(bool)), myCalcInstance, SLOT(slotGroupboxClicked(bool)));
In slotGroupboxClicked speichere ich dann die Bool-Variable und in einer Thread-internen Bool-Variable.

Im Endeffekt schaut das Phänomen so aus, als wenn quasi die Signale "zwischengelagert" werden und erst dann, gefühlt "wenns eben passt", vom Thread abgeholt werden.

Kann man das so handhaben, das ein abgeschicktes Signal den Slot im Thread ziemlich "direkt" aufruft?
Sonst hat man später das Problem, dass GUI Aktionen nicht direkt Einfluss auf den Worker-Thread haben.

Bitte habt Nachsicht mit mir, ich bin noch sehr neu auf dem Gebiet.
Für Hilfe wäre ich wieder sehr dankbar. Danke!
pbooster2000
Beiträge: 10
Registriert: 25. November 2010 17:55

Beitrag von pbooster2000 »

Ok, soweit ich das richtig verstehe, besteht das Problem darin, dass automatisch QueuedConnections verwendet werden, wenn beim Connect das Signal aus einem anderen Thread kommt, als da wo der Slot sitzt.

Das ist bei mir der Fall. Signal kommt vom Gui-Thread, der Slot sitzt im Workerthread. Daher wird das Signal gequeued.

Kann man denn trotzdem im WorkerThread Einfluss darauf haben, dass man möglichst den aktuellsten Gui-Stand mitbekommt?
Antworten