oh, jetzt wird es etwas hitzig... Sehr schön
Also schaffen wir Klarheit:
1. Ein Thread ist letztendlich eine, in einem bestimmten Kontext ausgeführte, Funktion.
Code: Alles auswählen
d->handle = (Qt::HANDLE) _beginthreadex(NULL, d->stackSize, QThreadPrivate::start, this, CREATE_SUSPENDED, &(d->id));
Das bedeutet, dass das Objekt der Klasse, die von QThread abgeleitet ist, repräsentiert nicht den Thread und lebt selbst in dem Thread in dem es instanziert war. Nach dem Aufruf von QThread::start() wird die run()-Methode gestartet und NUR diese läuft im neuen Thread ab. Selbstverständlich, alle Methoden, die man innerhalb der run()-Funktion aufruft, werden im entsprechenden Thread laufen. Auch alle in der run() instanzierten Objekte leben im Specherberech dieses Threads.
2. Object-Model. Interessanter wird es bei den Signalen und Slots. Hier muss man unterscheiden zwischen folgenden Situationen für Triggerung von Signalen in der run():
a) Direkter Aufruf von Slots ist ein gewöhnlicher Funktionsaufruf, erfolgt also in dem run()-Thread
b) Lebt der Empfänder des Signals in der run() so wird sein Slot bei AutoConnection direkt im run()-Thread aufgerufen. Dasselbe passiert bei DirectConnection.
c) Die Slots die über QueuedConnection oder BlockedQueuedConnection getriggert werden, werden per Event-Mechanismus aufgelöst und sind letztendlich in QEventLoop aufgerufen, normalerweise in dem Haupt-Thread der Anwendung.