QThread - GUI friert ein

Alles rund um die Programmierung mit Qt
Antworten
dave952
Beiträge: 6
Registriert: 20. Juli 2010 19:42
Kontaktdaten:

QThread - GUI friert ein

Beitrag von dave952 »

Hi Leute,

habe ein Problem mit QThread.
Also ich lasse eine Aufgabe in einem QThread ausführen.

Code: Alles auswählen

class readFile : public QThread
{
   Q_OBJECT
public
    virtual void run();
};

void readFile::run()
{
    //Datei einlesen und sonst was damit machen....
}
Wenn ich den Thread jetzt starte:

Code: Alles auswählen

readFile *thread = new readFile;
thread->start();
Wird der Thread zwar gestartet, aber während er die Aufgabe durchführt, kann ich die GUI nicht mehr benutzen. Ich kann noch nichtmal das Fenster verschieben!

Ist das Normal? Wenn nein, Was könnte der Grund dafür sein?

Gruss dave952
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Glaube ich nicht - zumindest nicht laut dem geposteten Code - bitte minimales kompilierbares Beispiel damit wir es nachvollziehen können.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dave952
Beiträge: 6
Registriert: 20. Juli 2010 19:42
Kontaktdaten:

Beitrag von dave952 »

Christian81 hat geschrieben:bitte minimales kompilierbares Beispiel damit wir es nachvollziehen können.
Wie meinst du das? Soll ich jetzt den ganzen Code posten oder eine kleines Projekt hochladen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

dave952 hat geschrieben:Soll ich jetzt den ganzen Code posten oder eine kleines Projekt hochladen?
Das heißt: Reduziere deinen Code auf das Minimum. Lass unnötige Berechnungen, Klassen, usw. weg. Keine komplexen GUIs.
Wenn die Gui einfriert, reicht eigentlich ein Widget mit z.B. nem Button, oder ein Lineedit. Da brauchts kein MainWindow samt deiner ganzen Toolbar, Menus, ...
Der Thread sollte aber ungefähr das machen, was er bei dir auch tut. Du solltest den nur soweit reduzieren, dass das Problem noch reproduzierbar ist. Und dein Code natürlich fehlerfrei kompilierbar :)
Alles über 200 Zeilen ist nicht mehr Minimal ;)
dave952
Beiträge: 6
Registriert: 20. Juli 2010 19:42
Kontaktdaten:

Beitrag von dave952 »

franzf hat geschrieben:
dave952 hat geschrieben:Soll ich jetzt den ganzen Code posten oder eine kleines Projekt hochladen?
Das heißt: Reduziere deinen Code auf das Minimum. Lass unnötige Berechnungen, Klassen, usw. weg. Keine komplexen GUIs.
Wenn die Gui einfriert, reicht eigentlich ein Widget mit z.B. nem Button, oder ein Lineedit. Da brauchts kein MainWindow samt deiner ganzen Toolbar, Menus, ...
Der Thread sollte aber ungefähr das machen, was er bei dir auch tut. Du solltest den nur soweit reduzieren, dass das Problem noch reproduzierbar ist. Und dein Code natürlich fehlerfrei kompilierbar :)
Alles über 200 Zeilen ist nicht mehr Minimal ;)
Aha also soll ich ein neues Projekt erstellen das alles so minimal machen, Thread erstellen, der die Aufgabe durchführt und dann alles hochladen, oder was? Sry aber ich versteh euch irgendwie nicht.

Achja, das Projekt hat sowieso nicht mehr als 200 Zeilen.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

dave952 hat geschrieben:
franzf hat geschrieben:
dave952 hat geschrieben:Soll ich jetzt den ganzen Code posten oder eine kleines Projekt hochladen?
Das heißt: Reduziere deinen Code auf das Minimum. Lass unnötige Berechnungen, Klassen, usw. weg. Keine komplexen GUIs.
Wenn die Gui einfriert, reicht eigentlich ein Widget mit z.B. nem Button, oder ein Lineedit. Da brauchts kein MainWindow samt deiner ganzen Toolbar, Menus, ...
Der Thread sollte aber ungefähr das machen, was er bei dir auch tut. Du solltest den nur soweit reduzieren, dass das Problem noch reproduzierbar ist. Und dein Code natürlich fehlerfrei kompilierbar :)
Alles über 200 Zeilen ist nicht mehr Minimal ;)
Aha also soll ich ein neues Projekt erstellen das alles so minimal machen, Thread erstellen, der die Aufgabe durchführt und dann alles hochladen, oder was? Sry aber ich versteh euch irgendwie nicht.

Achja, das Projekt hat sowieso nicht mehr als 200 Zeilen.
Du sollst ein, möglichst minimales, Projekt hochladen, welches deinen Fehler demonstriert, so dass wirs nachvollziehen/den Code prüfen können. Was ist daran jetzt so schwer zu verstehen? ;)
dave952
Beiträge: 6
Registriert: 20. Juli 2010 19:42
Kontaktdaten:

Beitrag von dave952 »

pfid hat geschrieben:
dave952 hat geschrieben:
franzf hat geschrieben:
dave952 hat geschrieben:Soll ich jetzt den ganzen Code posten oder eine kleines Projekt hochladen?
Das heißt: Reduziere deinen Code auf das Minimum. Lass unnötige Berechnungen, Klassen, usw. weg. Keine komplexen GUIs.
Wenn die Gui einfriert, reicht eigentlich ein Widget mit z.B. nem Button, oder ein Lineedit. Da brauchts kein MainWindow samt deiner ganzen Toolbar, Menus, ...
Der Thread sollte aber ungefähr das machen, was er bei dir auch tut. Du solltest den nur soweit reduzieren, dass das Problem noch reproduzierbar ist. Und dein Code natürlich fehlerfrei kompilierbar :)
Alles über 200 Zeilen ist nicht mehr Minimal ;)
Aha also soll ich ein neues Projekt erstellen das alles so minimal machen, Thread erstellen, der die Aufgabe durchführt und dann alles hochladen, oder was? Sry aber ich versteh euch irgendwie nicht.

Achja, das Projekt hat sowieso nicht mehr als 200 Zeilen.
Du sollst ein, möglichst minimales, Projekt hochladen, welches deinen Fehler demonstriert, so dass wirs nachvollziehen/den Code prüfen können. Was ist daran jetzt so schwer zu verstehen? ;)
Achso... Sry hab euch nur falsch verstanden... Warten kurz, ich lads gleich hoch.

Edit:
So hier is es. Aber es is das Original-Projekt, denn da sieht man es am besten. Das Projekte ist nicht wirklich groß, deswegen dürfte es auch nicht unübersichtlich sein. Ihr müsst, wenn ihr das Programm starten, auf "Open file" klicken, dann die HTML-Datei auswählen, die mit im ZIP-Archiv ist und dann startet der Thread.
Projekt wurde mit dem Qt Creator erstellt.
URL entfernt
Zuletzt geändert von dave952 am 21. Juli 2010 14:14, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Komiker...
Ich krieg hier nen SegFault. Du wahrscheinlich auch, nur hält das Programm an und der Creator geht in den Debugger :D -> Gui bleibt stehen!

Dein großer Fehler: Du greifst aus einem anderen Thread direkt auf die GUI zu, das ist verboten! Gui-Aktualisierungen sind nur aus dem Hauptthread heraus erlaubt - drum nenn man den auch gemeinhin "Gui-Thread".

Wenn der Thread läuft, machst du entweder
* deine Berechnungen, packst die in einen Member. Wenn dein Thread fertig ist, kann sich die GUI (über den SIGNAL(finished) des Threads) alle Daten auf einmal abholen. Bitte verwende dafür Strings(Listen) und keine QTreeWidgetItems!

Oder
*) Du informierst aus dem Thread heraus die Umwelt über Signals von den neuen Daten. Die Gui hänght sich an sie Signale und aktualisiert sich entsprechend.
dave952
Beiträge: 6
Registriert: 20. Juli 2010 19:42
Kontaktdaten:

Beitrag von dave952 »

franzf hat geschrieben:Komiker...
Ich krieg hier nen SegFault. Du wahrscheinlich auch, nur hält das Programm an und der Creator geht in den Debugger :D -> Gui bleibt stehen!

Dein großer Fehler: Du greifst aus einem anderen Thread direkt auf die GUI zu, das ist verboten! Gui-Aktualisierungen sind nur aus dem Hauptthread heraus erlaubt - drum nenn man den auch gemeinhin "Gui-Thread".

Wenn der Thread läuft, machst du entweder
* deine Berechnungen, packst die in einen Member. Wenn dein Thread fertig ist, kann sich die GUI (über den SIGNAL(finished) des Threads) alle Daten auf einmal abholen. Bitte verwende dafür Strings(Listen) und keine QTreeWidgetItems!

Oder
*) Du informierst aus dem Thread heraus die Umwelt über Signals von den neuen Daten. Die Gui hänght sich an sie Signale und aktualisiert sich entsprechend.
Nein, bei mir geht der Creator nicht in den Debug-Mode... naja egal.
Danke für die Info werd ich gleich mal ändern.

Edit: Jo jetzt funktioniert's! Danke nochmal, für die Hilfe.
Antworten