핑퐁 상태

핑퐁 상태 예제는 Qt State Machine 프레임워크에서 병렬 상태를 사용자 지정 이벤트 및 전환과 함께 사용하는 방법을 보여줍니다.

이 예제에서는 상태 머신에 이벤트를 게시하여 두 상태가 통신하는 상태 차트를 구현합니다. 상태 차트는 다음과 같습니다:

pingerponger 상태는 병렬 상태, 즉 동시에 입력되며 서로 독립적으로 전환을 수행합니다.

pinger 상태는 진입 시 첫 번째 ping 이벤트를 게시하고, ponger 상태는 pong 이벤트를 게시하여 응답하며, 이로 인해 pinger 상태는 새로운 ping 이벤트를 게시하는 등의 방식으로 통신합니다.

class PingEvent : public QEvent
{
public:
    PingEvent() : QEvent(PingEventType) { }
};

class PongEvent : public QEvent
{
public:
    PongEvent() : QEvent(PongEventType) { }
};

PingEventPongEvent 이라는 두 개의 사용자 정의 이벤트가 정의되어 있습니다.

class Pinger : public QState
{public: 명시적 Pinger(QState *부모) : QState(부모) { }protected: void onEntry(QEvent *) override { machine()->postEvent(new PingEvent);        qInfo() << "ping?";
    } };

Pinger 클래스는 상태가 입력될 때 상태 머신에 PingEvent 을 게시하는 상태를 정의합니다.

class PingTransition : public QAbstractTransition
{public: PingTransition() {}protected: bool eventTest(QEvent *e) override { return  e->type()== PingEventType; } void onTransition(QEvent *) override { machine()->postDelayedEvent(new PongEvent, 500);        qInfo() << "pong!";
    } };

PingTransition 클래스는 PingEvent 유형의 이벤트에 의해 트리거되는 전환을 정의하고, 전환이 트리거되면 상태 머신에 PongEvent (500밀리초 지연)를 게시합니다.

클래스 PongTransition : public QAbstractTransition
{public: PongTransition() {}protected: bool eventTest(QEvent *e) override { return (e->type()== PingEventType); } void onTransition(QEvent *) override { machine()->postDelayedEvent(new PingEvent, 500);        qInfo() << "ping?";
    } };

PongTransition 클래스는 PongEvent 유형의 이벤트에 의해 트리거되는 전환을 정의하고, 전환이 트리거되면 상태 머신에 PingEvent (500밀리초 지연)를 게시합니다.

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

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

main() 함수는 상태 머신과 병렬 상태 그룹을 생성하는 것으로 시작합니다.

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

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

그런 다음 병렬 상태 그룹을 부모 상태로 하여 pingerponger 상태가 생성됩니다. 트랜지션은 타깃이 없다는 점에 유의하세요. 이러한 전환이 트리거되면 소스 상태가 종료되었다가 다시 입력되지 않고 전환의 onTransition() 함수만 호출되며 상태 머신의 구성은 동일하게 유지되는데, 이 경우 우리가 원하는 것이 바로 이것입니다.

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

    return app.exec();
}

마지막으로 그룹이 상태 머신에 추가되고 머신이 시작되며 애플리케이션 이벤트 루프가 입력됩니다.

예제 프로젝트 @ code.qt.io

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.