我一直在使用 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 实现这样的事情?我应该以完全不同的方式思考这个问题吗?