我一直在使用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实现这样的功能呢?我应该以一种完全不同的方式来思考这件事吗?
发布于 2013-06-29 02:00:39
我不知道这是否是最佳实践,但我已经通过定期(1ms或更长时间)发送SM EvTick事件并在超级状态下处理该事件来解决了这个问题。您还可以添加ClearTimeout() SetTimeout()和DisableTimeout()成员函数,并像这样访问它们:
context< TimeoutSuperState >().SetTimeout(1000);您可以让超状态在超时时转换为错误状态,或者向SM发送EvOnTimeout,这可以根据状态的不同进行不同的处理。
https://stackoverflow.com/questions/15553145
复制相似问题