Aufruf von QThread.exec() Methode ist erforderlich, in QThread?
Bin ich nicht aufrufen exec()
in meinem code, aber die timer
und QUdpSocket
ist in Ordnung. Ist exec()
zu warten, für eine event
weiter?
UPDATE: die timer
arbeiten war, da hatte ich nicht genannt moveToThread(this)
auf die QThread
, was bedeutete, dass die QThread
war eigentlich noch Teil der main thread
. Für QUdpSocket
gut ich mit dem polling functions
. So dass Sie nicht brauchen, um die Arbeit mit signals
.
TIPP: wenn Sie tun müssen init
Zeug, das verlangt, dass eine event loop
in Ihrem QThread
können Sie delay
aufrufen moveToThread
bis Sie nicht brauchen, die signals
mehr, das ist praktisch, wenn das Programm geladen wird. Sie brauchen auch nicht zu rufen Sie im Konstruktor (Sie nennen könnte es in run()
zum Beispiel), kopieren Sie nur die this QThread
Zeiger auf eine variable und machen die call
später/anderswo mit der Maus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist, um tatsächlich nutzen deinen thread, statt des QApplication-Ausführung-Schleife, Sie müssen rufen Sie
moveToThread(this)
innerhalb der thread-Konstruktor UND legen eine Ausführung der Schleife innerhalb der geschütztenrun()
Methode Ihrer QThread abgeleiteten Klasse.Seperate threads Ausführung-Schleife verhindert, dass der QApplication-Schleife vollgestopft mit nicht-ui-bezogene Signale und slots, und daher die Verzögerung für die .e.g-Taste, klicken Sie auf slot-Ausführung, so dass Ihre Anwendung "lag".
Hinweis: Normalerweise können Sie immer Unterklasse QThread, siehe Qt-doc weitere Informationen
Edit: Qt-doc ist falsch, diesen thread Lesen https://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/
Ihre timer und sockel sind wohl mit die Haupt-event-Schleife gestartet wird, wenn Sie anrufen - Obwohl ich sicher bin, es gibt einen guten Grund zu laufen, ein Ereignis, eine Schleife in einem thread, ich kann nicht kommen mit ein.
QCoreApplication::exec()
.Den QThread Dokumentation Staaten:
Ohne eine Ereignis-Schleife, ist es möglich, zu emittieren Signale, die verarbeitet werden, die vom GUI-thread oder einem anderen thread mit einem event-loop. Dies impliziert, dass ein thread muss eine Ereignis-Schleife, um für seine slots werden wirksam. Pro die Dokumentation über einige Klassen, wie QTimer, erfordern eine laufende Ereignis-Schleife, die Sie anrufen müssen,
QThread::exec()
. Andere Klassen, wie QTCPSocket haben die Fähigkeiten, um mit laufen, mit oder ohne eine Ereignis-Schleife, je nach den verwendeten Funktionen. Die Dokumentation für die Klassen zeigen sollte, was, wenn überhaupt, Anforderungen Sie haben.exec()
genannt? Ist es in QThread abgeleiteten Konstruktor? Wenn ich den Anruf aus dem thread-erstellen von QThread, es geht um den thread zu blockieren.Es eine Abhängigkeit auf Ihre Programme. Hier ist ein Beispiel:
Ohne exec(), OnTransfer wird nie aufgerufen werden. ABER wenn Ihr erstellen curl draußen laufen mit diese (übernehmen MyThread Elternteil Haupt-thread), als Eltern :
Dieser wird so funktionieren, wie Sie erwartet. OnTransfer aufgerufen werden.