3

我正在用 Qt/c++ 编写一个软件,它通过串行与 arduino 和其他电子设备进行通信。

我需要启动一系列事件,这些事件以不同的时间调用不同的插槽,如下所示:

  • 启动电机 1 20 秒
  • 10 秒后启动电机 2
  • 停止电机 1
  • 更改电机 1 速度
  • 启动电机 1 30 秒

我试过 QTimer::singleShot 但它只适用于没有参数的插槽,我需要不时设置不同的参数,如电机速度。

现在我正在使用与 currentTime do dieTime 相对的延迟函数,但跟踪所有设备的时间很复杂。

这样做的最佳解决方案是什么?建议?

4

2 回答 2

4

如果您使用重载方法,则可以使用静态 QTimer 单次功能,该方法采用 Functor(函数对象)。这将允许您捕获所需的变量;哪个电机、速度、动作等。如果您不熟悉 Functor,可以在此处阅读有关它们的信息。

或者,由于该问题没有提供代码示例,我们假设您已经编写了用于启动和停止电机的函数。对于更直接的方法,使用 C++11,您可以执行以下操作:

StartMotor(1);

// Stop in 20 seconds
QTimer* p1 = new QTimer;
connect(p1, &QTimer::timeout, [=]{
    StopMotor(1);
    p1->deleteLater(); // clean up
});
p1->start(1000 * 20); // trigger in 20 seconds

// After 10 seconds, start motor 2

QTimer* p2 = new QTimer;
connect(p2, &QTimer::timeout, [=]{
    StartMotor(2);

    // And Stop Motor 1
    StopMotor(1);

    p2->deleteLater(); // clean up
});
p2->start(1000 * 10); // trigger in 10 seconds

...对于每个定时动作,依此类推。

于 2015-05-20T13:59:21.830 回答
3

为电机实现一个类,例如:

class Motor:public QObject
{
  Q_OBJECT
  public slots:
    void start();
    void start(int ms); //this one starts QTimer::singleShot and calls stop
    void stop();
};

我建议检查QStateMachine框架。当任务变得更加复杂时,最好使用 FSM,而不是信号槽调用的意大利面。

在我当前的项目中,我构建了一个基于 QStateMachine 的 FSM,其中 FSM 的定义是在 DSL(领域特定语言)中完成的。

于 2015-05-20T14:06:24.853 回答