同步 QStateMachine

Posted

技术标签:

【中文标题】同步 QStateMachine【英文标题】:Synchronise QStateMachine 【发布时间】:2018-04-13 09:26:54 【问题描述】:

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

void foo()

   emit stateChange1();
   ...
   mMember = true;

这里stateChange1()可能会改变状态机的状态,导致qml改变)。 mMember 直接更改 qml。 现在我的问题是,在设置mMember 隐含的状态更改之前处理statechange1() 隐含的(可能的)状态更改至关重要。然而,由于 QStateMachine 异步工作,我不能保证这一点。这个问题有什么优雅的解决方案吗?

【问题讨论】:

【参考方案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; );

【讨论】:

以上是关于同步 QStateMachine的主要内容,如果未能解决你的问题,请参考以下文章

区分同步代码块静态同步方法非静态同步方法的锁

rsync远程同步:下行同步上行同步+inotify实时同步

Java线程同步块行为 - 同步与同步()? [复制]

java多线程-同步块

两种同步模式:帧同步和状态同步

两种同步模式:帧同步和状态同步