在Qt'中实现事件转换和保护条件;s-QState机器

在Qt'中实现事件转换和保护条件;s-QState机器,qt,state-machine,qstatemachine,Qt,State Machine,Qstatemachine,我试图理解QStateMachine的用法,特别是处理触发转换的用户事件。此外,我想了解实现防护的最佳方法。我在下面画了一个状态机。它主要是顺序的,不是状态机的一个很好的例子,但是它可以达到不阻塞的目的,因为在等待QProcess调用的结果时会有延迟。相反,这些延迟作为超时事件异步处理 状态机在启动时假定没有rndis连接,然后定期运行更长的事件序列以检查连接。一旦检测到连接,将定期运行较短的检查以确保我们仍然连接,如果没有连接,则返回运行较长的检查 这是一些不完整的基本设置代码 // Set

我试图理解QStateMachine的用法,特别是处理触发转换的用户事件。此外,我想了解实现防护的最佳方法。我在下面画了一个状态机。它主要是顺序的,不是状态机的一个很好的例子,但是它可以达到不阻塞的目的,因为在等待QProcess调用的结果时会有延迟。相反,这些延迟作为超时事件异步处理

状态机在启动时假定没有rndis连接,然后定期运行更长的事件序列以检查连接。一旦检测到连接,将定期运行较短的检查以确保我们仍然连接,如果没有连接,则返回运行较长的检查

这是一些不完整的基本设置代码

// Set up state machine.  Do this so that checking for presence
// is non-blocking.  Delays are handled by framework.
//
QState* detected = new QState();
QState* notDetected = new QState();
QState* waitForIfDown = new QState();
QState* waitForCdcEther = new QState();

QEvent* timeout = new QEvent(QEvent::Type(EVENT_TIMEOUT));

m_machine.addState(detected);
m_machine.addState(notDetected);
m_machine.addState(waitForIfDown);
m_machine.addState(waitForCdcEther);

// Need to subclass QEventTransition and implement virtuals 
// onTransition and eventTest?

detected->addTransition();
notDetected->addTransition();
waitForIfDown->addTransition();
waitForCdcEther->addTransition();

m_machine.setInitialState(notDetected);
m_machine.start();
我可以在Detector对象上调用startTimer,这就是代码所在的位置。然后在Detector::timerEvent中,我可以将用户定义的“超时”事件发布到状态机。我还需要在每次转换时启动一个新计时器。每个转换的操作将发生在QEventTransition的子类中,可能是在“onTransition”方法中。如何将检测器对象传递给这些(唯一)转换对象中的每一个,使检测器成为调用startTimer()的检测器?此外,我不确定如何在两个具有保护条件的转换上实现保护条件。我在QAbstractTransition中看到了虚拟的“eventTest”,但不太明白如何使用它来实现一个保护。我很确定我的想法还不完全正确

我看了两本关于Qt的书(来自Summerfield和Ezust),还有:。这些书根本没有提到机器。在我看来,Qt在线文档似乎缺少足够的通用状态机示例代码。它很好地展示了如何使用现有信号创建转换,而不是用户定义的事件

欢迎任何帮助。谢谢


编辑:我意识到我可以用Detector::timerEvent()函数中的一个基本switch语句实现我自己的简单状态机。我现在正在做这件事,但我仍然非常有兴趣了解如何使用QStateMachine来完成这件事

您不想使用Qt消息触发转换,而是想使用事件,这有什么特别的原因吗?@Marco-您是指信号吗?不,没有理由。我查看事件的唯一原因是QEventTransition具有虚拟的“onTransition”和“eventTest”,它们似乎对处理转换操作和保护条件很有用。根据我对QStateMachine的经验,我一直使用消息来触发转换,但这并不意味着这是更好的方式,只是对我来说似乎更简单。如果您的QProcess类在每次超时时发出“detected”消息或“non detected”消息,您将能够以这种方式从notdetected切换到detected。然后,每次输入检测到或未检测到的值时,都可以使用onEntry Overrided方法启动计时器。我不知道这对您是否有意义,但如果您将代码发布到某个地方,我可以提供更多帮助。不幸的是,让QProcess确定是否存在连接会混淆对象的角色。例如,我运行一个在本地执行dhclient的QProcess。这个过程的成功运行并没有告诉我我与任何人都有联系,它只是告诉我我运行了这个过程。需要对dhcp客户端数据库文件进行进一步检查(在规定的延迟后),以确定是否建立了连接以及远程设备的IP地址。您是否返回到这个问题并给出了答案?我也遇到了类似的问题。