QThread und neue Objekte erzeugen

Alles rund um die Programmierung mit Qt
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

RavenIV hat geschrieben:Sorry solarix,
aber Du hast vermutlich nicht verstanden, was lepsai sagen wollte.
Werden Methoden einer "Thread-Klasse" von ausserhalb (also nicht run()) aufgerufen, laufen sie nicht im Kontext des Thread ab, sondern im Kontext des aufrufenden Threads.
"Alle anderen Methoden der Klasse werden im Main-Thread aufgerufen..." kann man nicht falsch verstehen. Das ist so nicht richtig.

@lepsai: jetzt klingt es schon viel richtiger.. allerdings wuerde ich ergaenzen:
a) Direkter Aufruf von Slots ist ein gewöhnlicher Funktionsaufruf, erfolgt also in dem Kontext des Aufrufers
c) Die Slots die über QueuedConnection oder BlockedQueuedConnection getriggert werden, werden per Event-Mechanismus aufgelöst und werden letztendlich im QEventLoop des Empfaengers (und damit auch im Threadkontext des Empfaengers) abgearbeitet.

Dass das "im Normalfall der Hauptthread" ist, wuerde ich so nicht schreiben, denn im Normalfall schiebe ich die Threadinstanz (wie Chr.81 geschrieben hat) mit moveToThread() zum Thread... und damit in den Eventloop der run()-Methode des Threads.


[EDIT]
Der komplette Source zeigt es: Christian hat recht. Da gehoert einfach noch ein moveToThread(..) hin ( in den Konstruktor oder beim Instanzieren).
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

@solarix: Meine erste Formulierung war etwas unpräzise, das stimmt. Mit "Normalfall" war eben gemeint, dass es keine explizite Threadzuweisung vorgenommen wurde...
@Bart: Ich habe mir die Sourcen angeguckt und muss sagen, dass es alles zu unstrukturiert ist. Es wäre nicht schlecht, wenn du genau beschreibst, was du erreichen willst. Dann könnte man dir einen Designvorschlag für diese Klasse machen. Ich vermute, es geht alles viel einfacher...
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Auch wenn es doof klingt, wo genau muss was rein.
Klar kann man das auch einfacher schreiben. Nur wollte ich an der Stelle das ganze als Thread laufe lassen.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Wie ich das sehe, willst du in bestimmten Zeitintervallen etwas aktualisieren.

Dann brauchst du keinen Thread sondern einen Timer, den du ja auch schon hast. Also mach im Konstruktor von deiner Klasse den Setup vom Timer und Signals/Slots und das war's. Wenn die Aktualisierung zu lange dauert und du bist der Meinung, dass das schlecht für die GUI ist, dann werden auch dieses Problem angehen, aber erstmal teste das alles ohne 2. Thread...
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Sorry das ich mich erst jetzt wieder melden.
Das mit dem Thread wollte ich als Musterbeispiel machen, da für das Projekt an dem ich da bastle noch komplizierter Threads gebraucht werden. Daher wollte ich es an dem erst mal testen. Ich weiß das das Beispiel etwas hingt und das man das normaler weise nicht als Thread machen braucht.
Ich hoffe ihr verraten mir trotzdem wo das moveToThread() rein muss.
Danke schon mal für eure Geduld.
Antworten