在Qt中计时事件的最佳方法

时间:2015-05-20 13:21:37

标签: c++ qt timing qtimer

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

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

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

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

现在我正在使用面向currentTime的延迟功能做dieTime,但跟踪所有设备的时序很复杂。

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

2 个答案:

答案 0 :(得分:4)

如果使用带有Functor(函数对象)的overloaded method,则可以使用静态QTimer单次拍摄功能。这将允许您捕获所需的变量;如果你不熟悉Functors,你可以阅读它们here

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

region(r1, 2110, [1,2]).
region(r2, 2210, [4,5,8]).
region(r3, 2310, [3,6]).
region(r4, 2410, [7,10,11,15]).
region(r5, 2510, [9,12]).
region(r6, 2610, [13,14]).

telephone(2310-6-64221, name(asd, nikos)).
telephone(2510-12-24234, name(dsa, kiki)).

next_to(2, 1).
next_to(1,4).
next_to(4, 5).
next_to(4, 8).
next_to(3, 6).
next_to(3, 5).
next_to(5, 8).
next_to(8, 9).
next_to(6, 7).
next_to(7, 10).
next_to(9, 12).
next_to(10, 11).
next_to(10, 15).
next_to(12, 15).
next_to(13, 14).

connect(X, Y) :-
    next_to(X, Y).
connect(X, Y) :-
    next_to(Y, X).

pathloop(Start, End, _, Path) :-
    connect(Start, End),
    Path = [Start, End].
pathloop(Start, End, Visited, Path) :-
    connect(Start, Middle),
    not(member(Middle, Visited)),
    pathloop(Middle, End, [Middle|Visited], PathRest),
    Path = [Start|PathRest].

can_call(PersonA, PersonB, Route) :-
    telephone(_-Area1-_, name(PersonA, _)),
    telephone(_-Area2-_, name(PersonB, _)),
    pathloop(Area1, Area2,_, Route).

......等等每个定时动作。

答案 1 :(得分: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(特定于域的语言)中完成的。