我有一个调度程序线程和一个监听器线程。调度命令时,我想等待响应,然后再发送后续命令。此外,在继续执行第二个命令之前,我需要检查响应,其中至少要确认已收到响应并且一切正常。我的伪代码如下:
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是处理异步事件并处理这些事件上的 Action 链/图的最强大的方法之一。 Qt提供了使用Qt-State machine framework实现FSM的基础。我建议走这条路。不幸的是,Qt为FSM提供的所有示例都涉及GUI和动画。
FSM方法的优点是,FSM既可以表示为图形也可以表示为表格。第一个选项对于理解非常有用,第二个选项对于验证没有任何循环和“死角”结束很有用。
我建立在Qt-FSM框架自己的框架的基础上,以特定于领域的语言定义FSM。我用它来控制一台复杂的机器,该机器具有一对异步运行的传感器执行器。使用DSL可以帮助我实现更高的抽象-在FSM图形的抽象级别。
关于c++ - 管理异步通信: how to examine response received in another thread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30945561/