In Ihrem Szenario antwortet ein Thread auf eine blockierende Lese-/Schreibmethode und wartet, bis er ein Schlüsselwort erkennt oder es kommt zu einer Zeitüberschreitung bei Verwendung von waitForKeyword(). Wenn readLines() zum Testen der App verwendet wird, wird leider nur ein kleiner Teil der Datei erhalten. Darüber hinaus gibt readLines während der zweiten Iteration sofort „false“ zurück, ohne auf eine Zeitüberschreitung zu warten.
Das Problem ergibt sich aus dem Design von readLines(), das alle verfügbaren Daten liest und in unterteilt Linien. Wenn eine Befehlsfolge verarbeitet wird, liest readLines() nur den ersten Teil der Datei, da das Schlüsselwort nicht erkannt wird. Wenn es anschließend erneut aufgerufen wird, gibt readLines() false zurück, da es bereits über die gesamten verfügbaren Daten iteriert hat.
Um effektiv eine Folge von Befehlen zu senden und auf ihre zu warten Um Antworten zu erhalten, sollten Sie die Verwendung eines State-Machine-Ansatzes in Betracht ziehen. Dies bietet eine strukturierte und zuverlässige Methode zur Verwaltung des Befehls- und Antwortflusses und stellt sicher, dass die erwartete Antwort empfangen wird, bevor fortgefahren wird.
Der folgende Codeausschnitt zeigt eine Zustandsmaschinenimplementierung mithilfe von Qts QStateMachine und verwandte Klassen:
class Programmer : public StatefulObject { Q_OBJECT AppPipe m_port { nullptr, QIODevice::ReadWrite, this }; State s_boot { &m_mach, "s_boot" }, s_send { &m_mach, "s_send" }; FinalState s_ok { &m_mach, "s_ok" }, s_failed { &m_mach, "s_failed" }; public: Programmer(QObject * parent = 0) : StatefulObject(parent) { connectSignals(); m_mach.setInitialState(&s_boot); send (&s_boot, &m_port, "boot\n"); expect(&s_boot, &m_port, "boot successful", &s_send, 1000, &s_failed); send (&s_send, &m_port, ":HULLOTHERE\n:00000001FF\n"); expect(&s_send, &m_port, "load successful", &s_ok, 1000, &s_failed); } AppPipe & pipe() { return m_port; } };
In diesem Beispiel kapselt Programmer die Zustandsmaschine und stellt eine Schnittstelle bereit um mit dem Gerät zu kommunizieren. Zustandsübergänge werden mithilfe der Funktionen send() und Expect() definiert, um das Senden von Befehlen bzw. das Warten auf erwartete Antworten zu verarbeiten.
Die Verwendung einer Zustandsmaschine hat mehrere Vorteile:
Das obige ist der detaillierte Inhalt vonWie kann eine Zustandsmaschine das Problem des unvollständigen Datenabrufs beim Senden einer Befehlsfolge und beim Warten auf Antworten lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!