Ich bin nicht sicher für Python, aber ich nehme an, dass myThread.quitOperation.emit()
sendet ein Signal für den Thread zu beenden. Der Punkt ist, dass, während Ihr Worker den Thread verwendet und weder zurückkehrt noch QCoreApplication::processEvents()
ausführt, myThread
niemals die Chance haben wird, Ihre Anfrage tatsächlich zu verarbeiten (dies wird Thread-Hunger genannt).
Die richtige Antwort hängt von der Situation und der Art des "Krams" ab, den Ihr Thread ausführt. Die gebräuchlichste Vorgehensweise ist, dass der Haupt-Thread ein Signal an den Worker-Thread sendet, wo ein Slot ein Flag setzt. Im Blockiervorgang überprüfen Sie diese Markierung regelmäßig. Es ist festgelegt, dass Sie aufhören, was auch immer Sie tun, sagen Sie Ihrem Worker-Thread, dass es beenden kann (mit einem Signal vorzugsweise mit eingereihten Verbindung), rufen Sie eine deleteLater()
auf das Worker-Objekt selbst und von allen Funktionen zurück, die Sie gerade sind , so dass der Event-Handler des Threads ausgeführt werden kann, und dein Worker-Objekt und sich selbst löschen können, und schließlich beenden.
Wenn Ihr "Zeug" ein riesiger Zyklus von sehr schnellen Operationen ist, wie einfache Mathematik oder Verzeichnisnavigation, die jeweils nur ein paar Millisekunden dauert, wird dies ausreichen.
Falls Ihre "Sachen" riesige blockierende Teile enthalten, auf die Sie keinen Einfluss haben (also können Sie diesen Flag-Aufruf nicht platzieren), müssen Sie möglicherweise im Hauptthread warten, bis der Worker-Thread beendet wird .
Wenn Sie die direkte Verbindung verwenden, um das Flag zu setzen, oder Sie setzen es direkt, schützen Sie den Lese-/Schreibzugriff des Flags mit einer QMutex
, um inkonsistente Lesevorgänge zu verhindern, oder verwenden Sie eine Warteschlange in der Warteschlange, um einen einzelnen Thread sicherzustellen Zugang der Flagge.
Obwohl stark davon abgeraten, optional können Sie QThread
terminate()
Methode verwenden, um den Thread sofort zu töten. Sie sollten dies niemals tun, da dies zu Speicherlecks, Heap-Beschädigung, Ressourcenlecks und anderen unangenehmen Dingen führen kann, da Destruktoren und Bereinigungscodes nicht ausgeführt werden und die Ausführung in einem unerwünschten Zustand angehalten werden kann.
Bitte zeigen Sie den Code, der Ihre Thread-Klasse definiert (einschließlich Signaldefinition) –
Im Allgemeinen führt die Bereitstellung eines SSCCE zu einer viel schnelleren Hilfe: Es ist viel einfacher, ein minimales vollständiges Arbeitsbeispiel zu behandeln. Siehe http://sscce.org/. – neuronet