首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::statechart -发布“串行超时”事件

boost::statechart -发布“串行超时”事件
EN

Stack Overflow用户
提问于 2013-03-22 00:36:09
回答 1查看 325关注 0票数 0

我一直在使用boost的异步状态图来编写程序。在这个程序中,我使用异步串行端口与另一个设备通信。我有一个状态,它等待设备通过串行端口进行确认,然后发布一个“确认已收到”事件。这工作得很好,但我也想实现一个“超时”事件。

在以前的程序中,我在状态机中使用switch case语句,其中的代码可以在每次运行循环时运行。这意味着我可以运行代码并检查是否应该由于某些超时而更改状态。如下所示:

代码语言:javascript
复制
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实现这样的功能呢?我应该以一种完全不同的方式来思考这件事吗?

EN

回答 1

Stack Overflow用户

发布于 2013-06-29 02:00:39

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

代码语言:javascript
复制
context< TimeoutSuperState >().SetTimeout(1000);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15553145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档