我的程序中有一个QStateMachine
的实例。我在它的构造函数中配置它的状态,转换和初始状态。当然,我在构造函数中启动它。
this->stateA = new StateA(this);
this->stateB = new StateB(this);
this->stateA->addTransition(this, &Machine::foo, this->stateB);
this->setInitialState(this->stateA);
this->start();
// At this point the machine is still not in the stateA
我遇到的问题是,机器在start()
完成执行之前没有移动到初始状态。这导致一个问题,即在输入初始状态之前发出信号foo
,该信号应该将机器从初始状态移动到另一个状态。
Machine* machine = new Machine();
// start() was already called here but the machine is still not in the initial state
machine->foo();
// Signal is emitted here (It also may not be emitted. This is not an unconditional transition). But the machine is still not in the initial state and the transition does not happen.
// ...
// Here the machine enters the initial state...
如何确保机器在构造时处于初始状态?
答案 0 :(得分:0)
状态机是异步的,由事件循环驱动。您没有理由在启动时使用信号将机器移动到另一个状态。就目前而言,只要发出stateA
,您就希望在启动和时从stateB
转换为foo
。
请记住,连接的目标可以是信号也可以是插槽。您可以将状态机的started
信号连接到foo
信号。这样,当机器启动并处于初始状态时,将发出foo
。
如果您不关心foo
信号,则可以将转换设置为直接在机器的started
信号上触发。
如果总是想要从stateA
过渡到stateB
,即使机器启动后的某个时间,stateA
也会以某种方式重新进入,您可以无条件地从初始状态转换为stateB
。输入stateA
后,机器将离开,然后自动输入stateB
。
从最后一个开始检查解决方案,如果需要不太通用的解决方案,请向上移动。
答案 1 :(得分:0)
您可以通过在构造函数中创建一个事件循环来确保机器在其构造点处于初始状态,如下所示:
// ...
this->start();
QEventLoop* eventLoop = new QEventLoop(this);
QObject::connect(
this, &Machine::started,
eventLoop, &QEventLoop::quit
);
eventLoop->exec();