„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > So beheben Sie unvollständiges Datenabruf mit Zustandsmaschinen (Befehle und Antworten)

So beheben Sie unvollständiges Datenabruf mit Zustandsmaschinen (Befehle und Antworten)

Gepostet am 2025-03-12
Durchsuche:747

How Can a State Machine Solve the Problem of Incomplete Data Retrieval When Sending a Sequence of Commands and Waiting for Responses?

senden eine Sequenz von Befehlen und Warten auf eine Antwort

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 verstehen

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 einen zuverlässigen Ansatz zu erreichen

, 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; } };

In diesem Beispiel verkauft der Programmierer die Statusmaschine und bietet eine Schnittstelle zur Kommunikation mit dem Gerät. Staatliche Übergänge werden unter Verwendung der Send () und erwartungsvoll () definiert, um Sendungsbefehle und Warten auf erwartete Antworten zu übernehmen. Antworten, Verhinderung der Kommunikation außerhalb der Bestellung.

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

: Die Zustandsmaschine kann gleichzeitig mit der Hauptanwendung ausgeführt werden, wobei Blockierprobleme beseitigt werden.

Neuestes Tutorial Mehr>

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