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

Posted IT1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt文档阅读笔记-Ping Pong States Example解析相关的知识,希望对你有一定的参考价值。

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

启动函数。

以上是关于Qt文档阅读笔记-Ping Pong States Example解析的主要内容,如果未能解决你的问题,请参考以下文章

IIS WebSocket Ping pong 非空闲时发送

Qt文档阅读笔记-Simple Chat Example解析

Qt文档阅读笔记-Qt5录音功能的实现

Qt文档阅读笔记-Broadcast Sender Example解析

Qt文档阅读笔记-QScopedPointer解析及实例

Qt文档阅读笔记-QNetworkProxy::ProxyType解析(Qt设置Fiddler代理)