管理异步通信:如何检查在另一个线程中收到的响应
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中,我可以使用信号和插槽以级联方式连接它们,因此当第一个信号被触发时,它会启动整个操作序列(每个插槽发出一个新信号),但看起来也很脏。
处理异步事件和处理这些事件的操作链/图的最可靠方法之一是FSM。 Qt为使用其Qt-State机器框架实现FSM提供了基础。我建议走这条路。不幸的是,Qt for FSM提供的所有示例都涉及GUI和动画。
FSM方法的优点是,FSM既可以表示为图形,也可以表示为表格。第一个选项非常适合理解,第二个选项非常适合验证,没有无休止的循环和"死胡同"。
我在Qt-FSM框架的基础上构建了自己的框架,用于用特定领域的语言定义FSM。我用它来控制一台复杂的机器,该机器有几个传感器参与者,所有参与者都异步工作。使用DSL可以帮助我在更高的抽象中实现 - 在FSM图的抽象级别。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 从C++11中的线程返回一个值
- qt多线程:计算一个积分
- volatile变量在一个客户线程和一个生产者线程中是否安全
- C++ pthread,两个线程读取一个全局变量
- 如何启动一个 boost::线程运行一个成员函数
- 如果另一个线程将一个元素推到向量的末尾,则向量上的迭代器无效
- Qt::线程是一个库还是仅仅是一个类
- 当一个线程锁定一个大映射时,如何避免冻结其他线程
- C++-如何让多个线程写入一个文件
- 为什么我的线程被一个关键部分阻塞,而没有被任何东西抓住
- 一个线程读一个线程写,std::deque是安全的
- 从c++线程发出一个信号
- 通信b/w两个线程在一个公共的数据结构.设计问题
- 如何使用boost运行线程另一个对象函数与回调
- 我可以在OpenMP分配多个线程到一个代码段
- 当我从线程B读取相同的变量时,我能从线程a写入一个变量吗
- 线程中一个套接字发送/接收
- 跨线程发送一个glib信号
- 用一个插入线程和一个读线程映射并发性