0

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

4

1 回答 1

0

我不知道这是否是最佳实践,但我已经通过EvTick定期发送我的 SM 事件(1ms 或其他时间)并以超级状态处理事件来解决这个问题。您还可以添加ClearTimeout() SetTimeout()DisableTimeout()成员函数并像这样访问它们:

context< TimeoutSuperState >().SetTimeout(1000);

您可以让超状态在超时时转换为错误状态,或者EvOnTimeout向 SM 发布一个可以根据状态进行不同处理的 SM。

于 2013-06-28T18:00:39.037 回答