在您的場景中,執行緒正在回應阻塞讀取/寫入方法,等待直到偵測到關鍵字或使用waitForKeyword( ) 超時。不幸的是,當使用 readLines() 來測試應用程式時,只獲得了檔案的一小部分。另外,readLines 在第二次迭代時立即傳回 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; } };
在這個範例中,Programmer 封裝了狀態機,並提供了與設備通訊的介面。狀態轉換是使用 send() 和 Expect() 函數定義的,分別處理發送命令和等待預期回應。
使用狀態機有幾個優點:
以上是狀態機如何解決發送命令序列並等待回應時資料檢索不完整的問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!