1. QTcpSocket und FortuneServer gehören zu unterschiedlichen Eventloops:
- Der QTcpSocket hat als Parent QTcpServer und wurde nicht mit moveToThread() verschoben
- Eine Signal-Slot-Connection vom Socket zum Server wird dann per AutoConnection zu einer "QueuedConnection"
- der Slot wird aber trotzdem im Kontext des Threads aufgerufen
- welcher dann irgendwas mit QTcpSocket macht (Lesen/Schreiben)
-> hast Recht: das führt zu Probleme, weil dann evt. parallel auf dem Socket gearbeitet wird...
2. der Socket und der FortuneServer gehören zur gleichen Eventloop
- der Socket muss mit "setParent(NULL)" und "moveToThread()" verschoben werden
- Die AutoConnection ergibt eine DirectConnection innerhalb des Eventloops des Threads.
-> keine Probleme
Mein Beispielcode könnte bleiben wie er ist, aber der Kontruktor sähe dann so aus:
Code: Alles auswählen
FortuneServer::FortuneServer(QTcpSocket *sock)
...
{
sock->setParent(NULL);
sock->moveToThread(this); // wir sind noch im Kontext der GUI.. ist ok..
}