Frage

Ich habe eine Qt-Anwendung, die zwei Threads hat: der Haupt-Thread, dass Griffe die GUI und ein zweiten Thread, die Netzwerkverbindungen verwaltet. Hier ist der Thread-Code:

void thread::run()
{
    QTcpServer server;

    server.connect(&server,SIGNAL(newConnection()),this,SLOT(OnConnect()));

    //...
}

Wenn ich einen Haltepunkt zu Beginn der OnConnect() setzen und Debuggen der Anwendung, es gibt bekannt, dass OnConnect() vom Hauptthread aufgerufen wird!

Wie kann ich OnConnect() Lauf im selben Thread wie die QTcpServer haben?

War es hilfreich?

Lösung

eine gründlichere Antwort zu geben, schauen ein wenig tiefer in wie Signal-Slot-Verbindungen und Threadkontexte interact. Im Grunde genommen für weitere Verbindungen (auto-Connect), wird der Schlitz sowohl direkt aufgerufen werden, wenn der Sender und der Empfänger in dem gleichen Thread-Kontext gibt, sonst wird es eine Warteschlange eingereiht Verbindung sein, und der Schlitz wird in dem Threadkontext ausgeführt wird von das Objekt, das in den Schlitz enthält. In diesem Fall muss es eine Warteschlange eingereiht werden, was bedeutet, dass der Thread Teil der Hauptanwendung der Thread-Kontextes ist, nicht seine eigenen. Dies wird verstärkt durch der Dokumentation Qt für eine bietet Übersicht seines Threading, wo es heißt, dass die QThread Instanz „im Besitz“ der Thread-Kontext, die sie geschaffen, nicht der Thread-Kontext, dass es darstellt. Das heißt, Sie haben drei Möglichkeiten:

  1. Sie können moveToThread () verwenden, den Faden in seinem eigenen Kontext zu bewegen. Beachten Sie, dass dies kann zu Problemen führen, wenn der Thread zu löschen, wenn Sie es zurück in den Kontext bewegen, wo sie vernichtet wird, und dies kann nur in dem Quelle-Thread-Kontext geschehen, so hätte es getan werden, bevor der Lauf Funktion verlassen.
  2. Sie können die QThread Instanz als Griff zum Faden behandeln, nicht als selbst einen Teil des Gewindes. Wenn Sie die Dinge im Zusammenhang mit dem neuen Thread getan benötigen, erstellen Sie ein anderes Objekt diejenigen zu handhaben, und instanziiert sie im Zusammenhang mit dem neuen Thread (innerhalb der Lauffunktion). Dies ist, was ich empfehlen würde.
  3. Kraft eine direkte Verbindung. Das heißt, Sie brauchen würde, den Code ausgeführt wird in den Schlitz, um sicherzustellen, ist Thread-sicher, Qt integrierten Methoden ignorieren machen diese Funktionen Thread-sicher. Dies ist, was Sie getan haben .

Andere Tipps

Es scheint, wie das Problem war, dass ich nicht Qt::DirectConnection als letzter Parameter von connect() vorging.

Nach dem Hinzufügen, dass es funktionierte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top