シナリオでは、スレッドはブロッキング読み取り/書き込みメソッドに応答し、キーワードが検出されるまで待機します。または、waitForKeyword() を使用してタイムアウトします。残念ながら、readLines() を使用してアプリをテストすると、ファイルのごく一部しか取得されません。さらに、readLines は 2 回目の反復中にタイムアウトを待たずに即座に false を返します。
この問題は、利用可能なすべてのデータを読み取り、データを分割する readLines() の設計に起因します。線。一連のコマンドが処理されているとき、readLines() はキーワードを検出しないため、ファイルの最初の部分のみを読み取ります。その後、再度呼び出されると、readLines() は利用可能なデータ全体をすでに反復処理しているため false を返します。
一連のコマンドを効果的に送信し、そのコマンドの受信を待つため応答するには、ステート マシン アプローチの利用を検討してください。これにより、コマンドと応答のフローを管理するための構造化された信頼性の高い方法が提供され、続行する前に期待される応答が確実に受信されるようになります。
次のスニペットは、Qt を使用したステート マシンの実装を示しています。 QStateMachine および関連クラス:
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; } };
この例では、プログラマーはステート マシンをカプセル化し、ステート マシンと通信するためのインターフェイスを提供します。 デバイス。状態遷移は、send() 関数と Expect() 関数を使用して定義され、それぞれコマンドの送信と予期される応答の待機を処理します。
ステート マシンを使用すると、次のような利点があります。
以上がステート マシンは、一連のコマンドを送信して応答を待つときに不完全なデータ取得の問題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。