2016-07-26 12 views
0

Dies ist eher eine hypothetische Frage; Ich habe einige Probleme mit einem Programm und ich frage mich, ob es wegen Multithreading sein könnte.Multithreading-Probleme

Ich habe ein Haupt-Thread und ein Worker-Thread. Der Worker-Thread kommuniziert mit einer Maschine über einen seriellen Port, und wenn er eine Ausgabe von der Maschine empfängt, gibt er ein Pyqt-Signal aus. Es gibt einen Schlitz im Haupt-Thread, der das Signal empfängt und diesen Ausgang verarbeitet. Die Verarbeitung ist ein langwieriger Prozess, der das Erstellen eines anderen Objekts aus der Ausgabe umfasst.

Wenn der Worker-Thread den Haupt-Thread zweimal aufrufen würde, bevor die erste Ausgabe verarbeitet wurde, was würde passieren?

+0

Was meinen Sie mit 'emittiert ein Signal'? Beziehen Sie sich auf PyQt Signale? – jweyrich

+0

Ja, tut mir leid, ich werde das in meine Frage setzen –

Antwort

1

Während Ihr Hauptthread eine lange Aufgabe ausführt (die von einem Ereignis stammt), werden keine neuen Ereignisse verarbeitet. Alle neuen Ereignisse werden in einer threadspezifischen Warteschlange in die Warteschlange gestellt und später bei der Ausführung der Ereignisschleife verarbeitet. Wenn der Zielthread ist und schläft, wird das neue Ereignis in die Warteschlange gestellt und der Thread wird aufgeweckt, um es zu verarbeiten.

Sie können die Dokumentation zu The Event System lesen.

+2

Der entscheidende Punkt ist, dass Cross-Thread-Signale als Ereignisse verpackt und in der Ereignis-Warteschlange des Threads, wo der Empfangs-Slot lebt. Der Slot wird aufgerufen, sobald die Steuerung zur Ereignisschleife zurückkehrt und die in der Warteschlange befindlichen Signal-Ereignisse verarbeitet werden können (was in der Reihenfolge geschieht, in der sie ausgegeben wurden). – ekhumoro