管理异步通信:如何检查在另一个线程中收到的响应
Managing asynchronous communication: how to examine response received in another thread
我有一个调度程序线程和一个侦听器线程。当我发送命令时,我想在发送后续命令之前等待响应。此外,我需要先检查响应,然后才能继续执行第二条命令,其中最重要的是确认已收到响应并且一切正常。我的伪代码如下:
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 中,我可以使用信号和槽以级联方式连接它们,因此当第一个信号被触发时,它会启动整个操作序列(每个槽都会发出一个新信号),但看起来也很脏。
处理异步事件和处理针对这些事件的 chains/graphs 操作的最可靠方法之一是 FSM。 Qt 为使用其 Qt-State machine framework 实现 FSM 提供了基础。我建议走这条路。不幸的是,Qt 为 FSM 提供的所有示例都涉及 GUI 和动画。
FSM 方法的优势在于,FSM 既可以表示为图形,也可以表示为表格。第一个选项非常适合理解,第二个选项用于验证,没有无限循环并且 "dead" 结束。
我在 Qt-FSM 框架的基础上构建了自己的框架,用于在领域特定语言中定义 FSM。我用它来控制一台复杂的机器,它有几个异步工作的传感器演员。使用 DSL 帮助我实现更高的抽象 - 在 FSM-graphs 的抽象级别。
我有一个调度程序线程和一个侦听器线程。当我发送命令时,我想在发送后续命令之前等待响应。此外,我需要先检查响应,然后才能继续执行第二条命令,其中最重要的是确认已收到响应并且一切正常。我的伪代码如下:
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 中,我可以使用信号和槽以级联方式连接它们,因此当第一个信号被触发时,它会启动整个操作序列(每个槽都会发出一个新信号),但看起来也很脏。
处理异步事件和处理针对这些事件的 chains/graphs 操作的最可靠方法之一是 FSM。 Qt 为使用其 Qt-State machine framework 实现 FSM 提供了基础。我建议走这条路。不幸的是,Qt 为 FSM 提供的所有示例都涉及 GUI 和动画。
FSM 方法的优势在于,FSM 既可以表示为图形,也可以表示为表格。第一个选项非常适合理解,第二个选项用于验证,没有无限循环并且 "dead" 结束。
我在 Qt-FSM 框架的基础上构建了自己的框架,用于在领域特定语言中定义 FSM。我用它来控制一台复杂的机器,它有几个异步工作的传感器演员。使用 DSL 帮助我实现更高的抽象 - 在 FSM-graphs 的抽象级别。