QThread: Funktionsweise

Alles rund um die Programmierung mit Qt
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

QThread: Funktionsweise

Beitrag von Illuminatus »

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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QThread: Funktionsweise

Beitrag von franzf »

Illuminatus hat geschrieben:Wie kann ich das mit der Instanz von QThread bewerkstelligen? movetoThread bekommt ja eine Instanz von QThread übergeben????
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
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Re: QThread: Funktionsweise

Beitrag von Illuminatus »

franzf hat geschrieben:
Illuminatus hat geschrieben:Wie kann ich das mit der Instanz von QThread bewerkstelligen? movetoThread bekommt ja eine Instanz von QThread übergeben????
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.
Also muss ich in der Instanz von CSVParser , also pratkisch bevor ich die ganze Arbeit (parsen) mache, movetoThread(*meinAuslagerungsThread) aufrufen?

und ich versteh nicht ganz wie du meinst bezüglich der start() oder SIGNAL/SLOT?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: QThread: Funktionsweise

Beitrag von solarix »

Illuminatus hat geschrieben: Also muss ich in der Instanz von CSVParser , also pratkisch bevor ich die ganze Arbeit (parsen) mache, movetoThread(*meinAuslagerungsThread) aufrufen?
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:

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(.....));
Illuminatus hat geschrieben: und ich versteh nicht ganz wie du meinst bezüglich der start() oder SIGNAL/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:

Code: Alles auswählen

   // in der GUI:
   .... initialisierung
   mParser->start();

  // in der Parserklasse:
  void CSVParser::start() 
  {
    emit startParser();
  }
"startParser()" ist dann verbunden mit einem private Slot von CSVParser und führt diesen damit im Thread-Kontext aus.

hth..
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

Ah perfekt! ich glaube ich hab verstanden was ihr meint! werde das gleich mal morgen ausprobieren!

Vielen Dank für eure hilfe!
bbt
Beiträge: 29
Registriert: 2. Februar 2010 19:21

Beitrag von bbt »

Wie kann man dann so einen Thread am besten unterbrechen?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Wie jeden anderen Thread... ist ja egal, ob es die Methode "Mythread::run()" (von QThread geerbt) ist oder "Worker::doWork()" (von QObject geerbt).
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

Muss ich auf irgendwelche speziellen Dinge achten bezüglich der Speicherfreigabe durch den Thread?
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

Wie kann ich den Thread Speicher resetten, also einfach Destrutkor aufrufen?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ein QThread ist wie ein ganz normales Objekt - delete löscht es. Man sollte allerdings darauf achten dass der Thread nicht mehr läuft wenn man ihn löscht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

Muss man den Thread Threadkontext (QThread *mThread) auch starten?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Illuminatus hat geschrieben:Muss man den Thread Threadkontext (QThread *mThread) auch starten?
Was meinst Du damit? Ob man QThread::start() aufrufen muss?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

Ich hab Probleme das Beispiel von Solarix zu verstehen -.-

Ich dachte ich muss eine "start Methode" in meiner Parser klasse schreiben, die an den ThreadContext übergeben und dann die start() meiner CSV KLasse aufrufen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

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
Illuminatus
Beiträge: 84
Registriert: 3. Dezember 2008 12:48

Beitrag von Illuminatus »

Ja aber laut dem Post vor einigen Tagen, is das der "falsche weg" einen thread zu implementieren oder hab ich das falsch verstanden??? Ich kann die doku nicht mit dem movetothread zusammenbringen
Antworten