gpt4 book ai didi

c++ - QStateMachine 的同步问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:21 24 4
gpt4 key购买 nike

我的程序中有一个 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...

如何确保机器在 build 时处于初始状态?

最佳答案

状态机是异步的,由事件循环驱动。您没有理由在启动时使用信号将机器移动到另一个状态。就目前而言,您希望在启动时从stateA 转换到stateB,并且在发出foo 时。。 p>

  1. 请记住,连接的目标可以是信号或槽。您可以将状态机的 started 信号连接到 foo 信号。这样,foo 将在机器启动并处于初始状态时发出。

  2. 如果您不关心 foo 信号,您可以将转换设置为直接在机器的 started 信号上触发。

  3. 如果您总是想要从stateA 转换到stateB,即使是在机器启动和一段时间之后stateA 以某种方式重新进入,您可以广告从初始状态到 stateB 的无条件转换。机器在进入 stateA 后会自动离开,然后自动进入 stateB

从最后一个开始检查解决方案,如果您需要一个不太通用的解决方案,则向上移动。

关于c++ - QStateMachine 的同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31972167/

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