귀하의 시나리오에서는 스레드가 차단 읽기/쓰기 방법에 응답하고 키워드를 감지할 때까지 기다립니다. 또는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!