In Ihrem Szenario antworten ein Thread auf eine blockierende Lesung/Schreibmethode, bis es ein Keyword oder Times mit WaitForKeyword () erkennt. Leider wird beim Testen von Readlines () nur ein kleiner Teil der Datei erhalten. Darüber hinaus gibt Leadlines während der zweiten Iteration sofort false zurück, ohne auf Timeout zu warten.
Das Problem stammt aus dem Design von Readlines (), in dem alle verfügbaren Daten liest und sie in Zeilen unterteilt. Wenn eine Folge von Befehlen verarbeitet wird, liest Readlines () nur den ersten Teil der Datei, da das Schlüsselwort nicht erkennt. Anschließend gibt Readlines (), wenn es erneut aufgerufen wird, falsch zurück, da es bereits über die gesamten verfügbaren Daten iteriert wurde.
, um eine Abfolge von Befehlen effektiv zu senden und auf ihre Antworten zu warten, in Betracht zu ziehen, einen staatlichen Maschinenansatz zu verwenden. Dies liefert eine strukturierte und zuverlässige Methode zum Verwalten des Flusses von Befehlen und Antworten und sorgt dafür, dass die erwartete Antwort vor dem Verfahren empfangen wird. Q_object AppPipe m_port {nullptr, qiodevice :: readWrite, this}; Status s_boot {& m_mach, "s_boot"}, s_send {& m_mach, "s_send"}; FinalState s_ok {& m_maach, "s_ok"}, s_failed {& m_mach, "s_failed"}; öffentlich: Programmierer (QObject * Parent = 0): StatefulObject (Eltern) {{ ConnectSignals (); m_maach.setInitialState (& s_boot); send (& s_boot, & m_port, "boot \ n"); erwarten (& s_boot & m_port, "boot erfolgreich", & s_send, 1000, & s_failed); send (& s_send, & m_port, ": hullothere \ n: 00000001ff \ n"); erwarten (& s_send & m_port, "laden erfolgreich", & s_ok, 1000, & s_failed); } AppPipe & Pipe () {return m_port; } };
Timeout-Handling
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; } };
asynchronous Nature
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3