Dans votre scénario, un thread répond à une méthode de lecture / écriture de blocage, en attendant qu'il détecte un mot-clé ou des fois à l'aide de WaitForkeword (). Malheureusement, lorsque des lines de lecture () sont utilisées pour tester l'application, seule une petite partie du fichier est obtenue. De plus, Readlines renvoie immédiatement Faux pendant la deuxième itération sans attendre le délai d'attente.
Le problème découle de la conception de Readlines (), qui lit toutes les données disponibles et la sépare en lignes. Lorsqu'une séquence de commandes est en cours de traitement, Readlines () ne lit que la première partie du fichier car elle ne détecte pas le mot-clé. Par la suite, lorsqu'il est appelé à nouveau, Readlines () renvoie False car il a déjà itéré sur l'ensemble des données disponibles.
pour envoyer efficacement une séquence de commandes et attendre leurs réponses, envisager d'utiliser une approche de la machine d'état. 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 procéder. Q_Object Apppipe m_port {nullptr, qiodevice :: readwrite, this}; État 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"}; publique: Programme ConnectSignals (); m_mach.setInitialState (& s_boot); envoyer (& s_boot, & m_port, "boot \ n"); attendez (& s_boot, & m_port, "Boot réussit", & s_send, 1000, & s_failed); envoyer (& s_send, & m_port, ": hullothere \ n: 00000001ff \ n"); attendre (& s_send, & m_port, "charger réussi", & s_ok, 1000, & s_failed); } AppPipe & Pipe () {return m_port; } };
Tirage de temps mort
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; } };
nature asynchrone
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3