Seite 1 von 1

QThread - GUI friert ein

Verfasst: 21. Juli 2010 11:46
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

Verfasst: 21. Juli 2010 12:39
von Christian81
Glaube ich nicht - zumindest nicht laut dem geposteten Code - bitte minimales kompilierbares Beispiel damit wir es nachvollziehen können.

Verfasst: 21. Juli 2010 13:04
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?

Verfasst: 21. Juli 2010 13:09
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 ;)

Verfasst: 21. Juli 2010 13:13
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.

Verfasst: 21. Juli 2010 13:20
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? ;)

Verfasst: 21. Juli 2010 13:31
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

Verfasst: 21. Juli 2010 14:09
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.

Verfasst: 21. Juli 2010 14:13
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.