提升::状态图 ---发布"serial timeout"事件
boost::statechart ---posting a "serial timeout" event
我一直在使用boost的异步状态图来编写程序。在这个程序中,我使用异步串行端口与另一个设备通信。我有一个状态,等待设备通过串行端口确认,然后发布"收到确认"事件。这工作得很好,但是,我也想实现一个"超时"事件。
在之前的程序中,我一直在我的状态机中使用switch case语句,其中我的代码可以在每次循环运行时运行。这意味着我可以运行代码并检查是否应该由于超时而更改状态。这样的:
while(1){
switch (state){
case 0:{
sendMessage();
state = 1;
sendTime = boost::chrono::steady_clock::now();
}
break;
case 1:{
if (isConfirmationReceived()){
// do something
state = 2;
}
else if (boost::chrono::steady_clock::now() > sendTime + boost::chrono::duration<double>(WAIT_LENGTH)){
//raise a time out error
state = 3;
}
}
break;
// etc etc
}
}
我如何实现这样的东西使用boost::StateChart?我是否应该换个角度思考这件事?
我不知道这是否是最佳实践,但我通过定期(1ms或其他)发送我的SM EvTick
事件并在超级状态下处理事件来解决这个问题。您还可以添加ClearTimeout() SetTimeout()
和DisableTimeout()
成员函数,并像这样访问它们:
context< TimeoutSuperState >().SetTimeout(1000);
您可以让超状态在超时时转换到错误状态,或者将EvOnTimeout
发送到SM,这可以根据状态进行不同的处理。
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- Windows 进程间同步类似事件?
- 如何从C++端挂接到 QML 项的 onClick 事件
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- C++ 信号和插槽不工作:插槽不响应事件
- 在虚幻引擎中触发C++ dll的事件
- 提升::状态图 ---发布"serial timeout"事件