【问题标题】:boost::statechart ---posting a "serial timeout" eventboost::statechart ---发布“串行超时”事件
【发布时间】:2013-03-21 16:36:09
【问题描述】:

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

【问题讨论】:

    标签: c++ boost boost-statechart


    【解决方案1】:

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

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

    您可以让超状态在超时时转换为错误状态,或者将EvOnTimeout 发送到 SM,这可以根据状态进行不同的处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多