同步QStateMachine

时间:2018-04-13 09:26:55

标签: qt qstatemachine

我有一个类,其内部状态决定了QML文件中的布局。现在这个内部状态主要由状态机决定。但是,它的一部分不是由状态机决定的,而是依赖于其他成员变量来设置。我有以下情况:

$(".dynamically").bind( "click", function(event) {
      alert("The div " + event.target.innerText+ " was clicked.");
});


<div class="dynamically">div 1</div>
<div class="dynamically">div 2</div>

此处void foo() { emit stateChange1(); ... mMember = true; } 可能会更改状态机的状态,从而导致qml更改)。 mMember直接更改qml。 现在我的问题是,在设置stateChange1()隐含的状态更改之前,处理statechange1()隐含的(可能的)状态更改至关重要。但是由于QStateMachine异步工作,我无法保证这一点。这个问题有没有优雅的解决方案?

1 个答案:

答案 0 :(得分:1)

最有可能的是,您需要将操作提交给线程的事件队列或状态机的事件队列 - 因此它将在其他操作完成后执行。

使用code from this answer,按如下方式转换代码:

template <typename F>
static void postToStateMachine(F && fun, QStateMachine * sm) {
   sm->postEvent(new detail::FEvent<F>(std::forward<F>(fun)));
}

void Class::foo() {
  emit stateChange1();
  ...
  postToObject([this]{ mMember = true; }, this);
  // or
  postToStateMachine([this]{ mMember = true; });
}