Qt文档阅读笔记-Ping Pong States Example解析

x33g5p2x  于2022-05-05 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(644)

Ping Pong States例子实现了使用状态机框架的功能,使用并行状态和自定义事件和转换。

这个例子的逻辑是,两个状态之间的交流,一个状态发起响应,另外一个状态回复响应,如下图:

pinger和ponger是并行的状态,同时运行,并且独立转换互不影响。

pinger首先发起第一个ping事件,ponger接收后,响应一个pong事件。就这样一直重复下去。

class PingEvent : public QEvent
 {
 public:
     PingEvent() : QEvent(QEvent::Type(QEvent::User+2))
         {}
 };

 class PongEvent : public QEvent
 {
 public:
     PongEvent() : QEvent(QEvent::Type(QEvent::User+3))
         {}
 };

2个自定义事件,PingEvent和PongEvent。

class Pinger : public QState
 {
 public:
     Pinger(QState *parent)
         : QState(parent) {}

 protected:
     void onEntry(QEvent *) override
     {
         machine()->postEvent(new PingEvent());
         fprintf(stdout, "ping?\n");
     }
 };

Pinger类中抛出PingEvent。

class PongTransition : public QAbstractTransition
 {
 public:
     PongTransition() {}

 protected:
     bool eventTest(QEvent *e) override {
         return (e->type() == QEvent::User+3);
     }
     void onTransition(QEvent *) override
     {
         machine()->postDelayedEvent(new PingEvent(), 500);
         fprintf(stdout, "ping?\n");
     }
 };

PongTransition类定义了转换,在转换中发起了PingEvent事件(延迟500毫秒)。

int main(int argc, char **argv)
 {
     QCoreApplication app(argc, argv);

     QStateMachine machine;
     QState *group = new QState(QState::ParallelStates);
     group->setObjectName("group");

main函数构建了状态机并且构造了并行状态组。

Pinger *pinger = new Pinger(group);
     pinger->setObjectName("pinger");
     pinger->addTransition(new PongTransition());

     QState *ponger = new QState(group);
     ponger->setObjectName("ponger");
     ponger->addTransition(new PingTransition());

构建了pinger和ponger。

machine.addState(group);
     machine.setInitialState(group);
     machine.start();

     return app.exec();
 }

启动函数。

相关文章