디스패처 스레드와 리스너 스레드가 있습니다. 명령을 보낼 때 후속 명령을 보내기 전에 응답을 기다리고 싶습니다. 또한 두 번째 명령을 진행하기 전에 응답을 검토해야합니다. 그 중 최소한 응답이 수신되고 모든 것이 정상인지 확인하는 것입니다. 내 의사 코드는 다음과 같습니다.
void MainWindow::downloadData()
{
dispatcher->getInfo(); // sends command
// QString response = receiver->response() // idealy I would like to check response but since its async, i can't really do that!
dipatcher->askData(); // the 2nd command and so forth
}
이 문제를 해결하는 우아한 방법이 있습니까? 내가 생각할 수있는 유일한 방법은 동일한 스레드를 사용하고 모든 호출이 차단되지만 반드시 좋은 해결책은 아닙니다.
Qt에서는 신호와 슬롯을 사용하여 계단식으로 연결할 수 있으므로 첫 번째 신호가 트리거되면 전체 작업 시퀀스 (각 슬롯이 새 신호를 방출 함)를 시작하지만 다소 더러워 보입니다.
비동기 이벤트를 처리하고 이러한 이벤트에 대한 작업 체인 / 그래프를 처리하는 가장 강력한 방법 중 하나는 FSM입니다. Qt는 Qt-State 머신 프레임 워크로 FSM을 구현하기위한 기반을 제공합니다 . 나는 이쪽으로가는 것이 좋습니다. 불행히도 Qt for FSM에서 제공하는 모든 예제는 GUI와 애니메이션을 다루고 있습니다.
FSM 접근 방식의 장점은 FSM을 그래프와 테이블로 표현할 수 있다는 것입니다. 첫 번째 옵션은 끝없는 루프와 "데드"엔드가 없다는 것을 이해하는 데 유용하고 두 번째 옵션은 검증 용입니다.
도메인 별 언어로 FSM을 정의하기위한 Qt-FSM 프레임 워크 자체 프레임 워크를 기반으로 구축했습니다. 나는 두 개의 센서 액터가 모두 비동기 적으로 작동하는 복잡한 기계를 제어하는 데 사용합니다. DSL을 사용하면 FSM 그래프의 추상화 수준에서 더 높은 추상화를 구현하는 데 도움이됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다