QThread: Funktionsweise
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
QThread: Funktionsweise
Hi ich habe den Blog über die korrekte Funktionsweise von QThreads gelsen, bin nun aber mehr verwirrt, als dass es geholfen hat. Es wird darauf verwiesen, dass man einen Thread nicht ableiten soll, sondern eine Instanz vom Typ QThread erzeugen soll und den Auftrag per movetoThread an den Thread weiterleitet.
Nun habe ich folgendes Problem: Ich parse mit einer CSVParser klasse und möchte das in einem Thread ausführen lassen, da das möglicherweise einige Zeit dauert und die GUI nicht blockiern soll.
Wie kann ich das mit der Instanz von QThread bewerkstelligen? movetoThread bekommt ja eine Instanz von QThread übergeben????
VG
Nun habe ich folgendes Problem: Ich parse mit einer CSVParser klasse und möchte das in einem Thread ausführen lassen, da das möglicherweise einige Zeit dauert und die GUI nicht blockiern soll.
Wie kann ich das mit der Instanz von QThread bewerkstelligen? movetoThread bekommt ja eine Instanz von QThread übergeben????
VG
Re: QThread: Funktionsweise
Ja, aber moveToThread ist eine Methode von QObject - du willst ja das Objekt in einen neuen Thread verschieben (eigentlich das Eventmanagement in die EventLoop des neuen Threads). Du musst also CSVParser von QObject ableiten. Aber pass auf, ein Funktionsaufruf geschieht immer im Context des aufrufenden Threads. Wenn deine CSVParser::start()-Methode selber rechnet, passiert das im Hauptthread. Wenn du das via moveToThread erledigen willst, muss das alles via SIGNAL/SLOTS resp. Events passieren.Illuminatus hat geschrieben:Wie kann ich das mit der Instanz von QThread bewerkstelligen? movetoThread bekommt ja eine Instanz von QThread übergeben????
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
Re: QThread: Funktionsweise
Also muss ich in der Instanz von CSVParser , also pratkisch bevor ich die ganze Arbeit (parsen) mache, movetoThread(*meinAuslagerungsThread) aufrufen?franzf hat geschrieben:Ja, aber moveToThread ist eine Methode von QObject - du willst ja das Objekt in einen neuen Thread verschieben (eigentlich das Eventmanagement in die EventLoop des neuen Threads). Du musst also CSVParser von QObject ableiten. Aber pass auf, ein Funktionsaufruf geschieht immer im Context des aufrufenden Threads. Wenn deine CSVParser::start()-Methode selber rechnet, passiert das im Hauptthread. Wenn du das via moveToThread erledigen willst, muss das alles via SIGNAL/SLOTS resp. Events passieren.Illuminatus hat geschrieben:Wie kann ich das mit der Instanz von QThread bewerkstelligen? movetoThread bekommt ja eine Instanz von QThread übergeben????
und ich versteh nicht ganz wie du meinst bezüglich der start() oder SIGNAL/SLOT?
Re: QThread: Funktionsweise
Es gibt viele Wege.. angenommen du hast in der GUI eine private Variabel "CSVParser *mParser" und einen im CTor aufgesetzen Threadkontext (QThread *mThread), könnte die Initialisierung so in etwa wie folgt aussehen:Illuminatus hat geschrieben: Also muss ich in der Instanz von CSVParser , also pratkisch bevor ich die ganze Arbeit (parsen) mache, movetoThread(*meinAuslagerungsThread) aufrufen?
Code: Alles auswählen
mParser = new CSVParser(filename);
mParser->moveToThread(mThread);
// jetzt möchtest du noch wissen, wann die Arbeit fertig ist:
connect(mParser, SIGNAL(done()), this, SLOT(.....));
Was franz meint ist, dass du über ein SIGNAL (aus dem GUI-Kontext) die Arbeit aktivieren musst.. dies könnte ein Signal "clicked()" eines QPushButtons sein oder aber auch mit einem Signal geschehen, welches sich der Parser selbst sendet, also so in etwa:Illuminatus hat geschrieben: und ich versteh nicht ganz wie du meinst bezüglich der start() oder SIGNAL/SLOT?
Code: Alles auswählen
// in der GUI:
.... initialisierung
mParser->start();
// in der Parserklasse:
void CSVParser::start()
{
emit startParser();
}
hth..
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ob mans glaubt oder nicht aber in der Doku steht haargenau was Du implementieren musst und wie Du den Thread startest...
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
-
- Beiträge: 84
- Registriert: 3. Dezember 2008 12:48