我可以使用boost.statecharts自定义对不同正交区域中多个状态的事件做出反应吗?
Can I custom react to a event in multiple states in different orthogonal reigions using boost.statecharts?
我的用例与此SSCCE类似。问题是,如果没有发生转换,我需要转发事件,这似乎不自然,因为它们由其他正交区域处理。更重要的是,虽然在我需要进行过渡的情况下,我无法找到一种方法来允许其他地区对该事件做出反应。我应该如何重组来解决这个问题?
如果这很重要,我使用boost 1.53。
namespace sc = boost::statechart;
struct Active;
struct Keyboard : sc::state_machine< Keyboard, Active > {};
struct NumLockOff;
struct CapsLockOff;
struct ScrollLockOff;
struct Active: sc::simple_state< Active, Keyboard, boost::mpl::list< NumLockOff, CapsLockOff, ScrollLockOff > > {};
struct EvNumLockPressed : sc::event< EvNumLockPressed > {};
struct EvCapsLockPressed : sc::event< EvCapsLockPressed > {};
struct EvScrollLockPressed : sc::event< EvScrollLockPressed > {};
struct EvAllLocksOffPressed : sc::event< EvAllLocksOffPressed > {
int i_;
EvAllLocksOffPressed(int i):sc::event< EvAllLocksOffPressed >(),i_(i){}
};
struct NumLockOn : sc::simple_state< NumLockOn, Active::orthogonal< 0 > >
{
typedef boost::mpl::list<sc::transition< EvNumLockPressed, NumLockOff >, sc::custom_reaction<EvAllLocksOffPressed>> reactions;
sc::result react( const EvAllLocksOffPressed & e)
{
if(e.i_ == 42)
return transit< NumLockOff >();
return forward_event();
}
};
struct NumLockOff : sc::simple_state< NumLockOff, Active::orthogonal< 0 > >
{
typedef sc::transition< EvNumLockPressed, NumLockOn > reactions;
};
struct CapsLockOn : sc::simple_state< CapsLockOn, Active::orthogonal< 1 > >
{
typedef boost::mpl::list<sc::transition< EvCapsLockPressed, CapsLockOff >, sc::custom_reaction<EvAllLocksOffPressed>> reactions;
sc::result react( const EvAllLocksOffPressed & e)
{
if(e.i_ == 42)
return transit< CapsLockOff >();
return forward_event();
}
};
struct CapsLockOff : sc::simple_state< CapsLockOff, Active::orthogonal< 1 > >
{
typedef sc::transition< EvCapsLockPressed, CapsLockOn > reactions;
};
struct ScrollLockOn : sc::simple_state< ScrollLockOn, Active::orthogonal< 2 > >
{
typedef boost::mpl::list<sc::transition< EvScrollLockPressed, ScrollLockOff >, sc::custom_reaction<EvAllLocksOffPressed>> reactions;
sc::result react( const EvAllLocksOffPressed & e)
{
if(e.i_ == 42)
return transit< ScrollLockOff >();
return forward_event();
}
};
struct ScrollLockOff : sc::simple_state< ScrollLockOff, Active::orthogonal< 2 > >
{
typedef sc::transition< EvScrollLockPressed, ScrollLockOn > reactions;
};
int main(){
Keyboard k;
k.initiate();
k.process_event(EvNumLockPressed());
k.process_event(EvCapsLockPressed());
k.process_event(EvScrollLockPressed());
k.process_event(EvAllLocksOffPressed(1));
k.process_event(EvAllLocksOffPressed(42));
}
这个问题是由库作者回答的。他指的是将事件分派到正交区域。
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- Boost状态机语言-"操作"中的"发布"事件
- 狂想曲C++状态图 - 事件(似乎有效)与触发操作(似乎什么都不做)
- 提升状态图中的多个延迟事件
- QTSCXML状态机中的事件处理
- 如何设置并发::事件对象,仅当它现在未处于信号状态时
- 当使用信号处理程序触发事件时,如何使boost.msm正确更改状态
- 如何使用C++获取自动重置事件的状态?
- 嵌入式系统状态模式:存储与异步事件相关的信息
- Boost statechart -使用triggering_event将事件数据传递给状态构造器
- 在boost状态图库中捕获丢弃的事件
- qstatemmachine获取导致状态转换的事件
- 提升::状态图 ---发布"serial timeout"事件
- 我可以使用boost.statecharts自定义对不同正交区域中多个状态的事件做出反应吗?
- 如何确定 Win32 事件的信号状态