gpt4 book ai didi

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

转载 作者:知者 更新时间:2024-03-13 01:18:09 24 4
gpt4 key购买 nike

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();
 }

启动函数。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com