Frage

Ich rufe nicht exec() in meinem Code, aber die timer und QUdpSocket funktionieren gut. Ist exec() verwendet zu warten, ein event weiter?

UPDATE: die timer arbeitet, weil ich nicht moveToThread(this) auf dem QThread genannt hatte, die die QThread gemeint war eigentlich noch Teil des main thread. Was QUdpSocket gut ich mit dem Polling functions. So ist es nicht mit signals zur Arbeit benötigte.

TIPP: wenn Sie brauchen init Sachen zu tun, die eine event loop in Ihrem QThread erfordert, können Sie anrufen delay moveToThread, bis Sie die signals nicht brauchen mehr, das praktisch ist, wenn das Programm geladen ist. Sie brauchen auch nicht in den Konstruktor nennen (Sie es in run() zum Beispiel nennen könnte), kopieren Sie einfach die this QThread Zeiger auf eine Variable und die call machen später / anderswo den Zeiger verwenden.

War es hilfreich?

Lösung

Um tatsächlich Thread zu verwenden, statt der QApplication Ausführungsschleife, haben Sie moveToThread(this) im Thread-Konstruktor aufzurufen und eine Ausführungsschleife innerhalb der geschützten run() Methode Ihrer QThread Klasse abgeleitet.

Seperate Fäden Ausführungsschleife verhindert die QApplication Schleife mit nicht-ui bezogenen Signalen und Slots überladen zu werden, und deshalb Verzögerung für .e.g Schaltfläche klicken die Schlitzausführung, so dass Ihre Anwendung „Verzögerung“.

Hinweis: Normalerweise Sie immer Unterklasse QThread finden Sie unter Qt doc < weitere Informationen / a>

Edit: Qt doc falsch ist, lesen Sie diesen Thread

Andere Tipps

Ihre Timer und Buchse verwenden wahrscheinlich die Hauptereignisschleife, die gestartet wird, wenn Sie QCoreApplication::exec() nennen. Obwohl ich bin sicher, es gibt einen guten Grund, eine Ereignisschleife in einem Thread ausgeführt wird, kann ich nicht mit einem kommen.

Die QThread Dokumentation heißt es:

  

Jeder QThread kann seine eigene Ereignisschleife haben. Sie können durch den Aufruf von exec (), um die Ereignisschleife beginnen; Sie können es stoppen, indem Sie exit () aufrufen oder beenden (). eine Ereignisschleife in einem Thread zu haben, macht es möglich, Signale von anderen Threads zu den Schlitzen in diesem Thread zu verbinden, einen Mechanismus namens Warteschlange Verbindungen. Es macht es auch möglich, Klassen zu verwenden, die die Ereignisschleife erfordern, wie QTimer und QTcpSocket, in dem Thread. Beachten Sie jedoch, dass es nicht möglich ist, Widget-Klassen im Thread zu verwenden.

Ohne eine Ereignisschleife, dann ist es möglich, Signale zu emittieren, die von dem GUI-Thread verarbeitet werden, oder einem anderen Thread eine Ereignisschleife enthält. Dies impliziert, dass ein Thread eine Ereignisschleife, um für die Schlitze sein effectual haben muß. Per Dokumentation über einige Klassen, wie QTimer erfordern, für die eine laufende Ereignisschleife Sie müssen rufen Sie QThread::exec() . Andere Klassen, wie QTcpSocket haben Fähigkeiten mit mit oder ohne Ereignisschleife laufen, je von den verwendeten Funktionen. Die Dokumentation für die Klassen sollten angeben, ob und welche Anforderungen sie haben.

Es hängt von Ihren Programmen. Hier ein Beispiel:

void MyThread::run(){
  Curl * curl = new Curl();
  connect( curl, SIGNAL(OnTransfer(QString)), this, SLOTS(OnTransfer(QString)) );
  connect( curl, SIGNAL(OnDone()), curl, SLOTS(deleteLater()) );
  curl->Download("http://google.com");
  exec(); // this is an event loop in this thread, it will wait until you command quit()
}

void MyThread::OnTransfer(QString data){
  qDebug() << data;
}

Ohne exec (), OnTransfer wird nie genannt werden. Aber wenn Ihr curl außerhalb Lauf erstellen mit dieses (nehmen MyThread Elternteil ist Haupt-Thread) als parent:

MyThread::MyThread(){
  curl = new Curl(this);
  connect( curl, SIGNAL(OnTransfer(QString)), this, SLOTS(OnTransfer(QString)) );
  start();
}
void MyThread::run(){
  curl->Download("http://google.com");
}

Dies funktioniert wie erwartet. OnTransfer aufgerufen werden.

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