Maison >développement back-end >C++ >Comment une machine à états peut-elle résoudre le problème de la récupération de données incomplètes lors de l'envoi d'une séquence de commandes et de l'attente de réponses ?
Dans votre scénario, un thread répond à une méthode de lecture/écriture bloquante, attendant qu'il détecte un mot-clé ou expire en utilisant waitForKeyword(). Malheureusement, lorsque readLines() est utilisé pour tester l'application, seule une petite partie du fichier est obtenue. De plus, readLines renvoie immédiatement false lors de la deuxième itération sans attendre l'expiration du délai.
Le problème vient de la conception de readLines(), qui lit toutes les données disponibles et les sépare en lignes. Lorsqu'une séquence de commandes est en cours de traitement, readLines() lit uniquement la première partie du fichier car elle ne détecte pas le mot-clé. Par la suite, lorsqu'il est à nouveau appelé, readLines() renvoie false car il a déjà parcouru l'ensemble des données disponibles.
Pour envoyer efficacement une séquence de commandes et attendre leur réponses, envisagez d’utiliser une approche de machine à états. Cela fournit une méthode structurée et fiable pour gérer le flux de commandes et de réponses, garantissant que la réponse attendue est reçue avant de continuer.
L'extrait suivant démontre une implémentation de machine à états utilisant Qt. QStateMachine et classes associées :
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; } };
Dans cet exemple, Programmer encapsule la machine à états et fournit une interface pour communiquer avec l'appareil. Les transitions d'état sont définies à l'aide des fonctions send() et expect() pour gérer respectivement l'envoi de commandes et l'attente des réponses attendues.
L'utilisation d'une machine à états présente plusieurs avantages :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!