我用Qt / c ++编写软件,通过串口与arduino和其他电子设备进行通信。
我需要启动一系列事件,以不同的时序调用不同的插槽,如下所示:
我尝试使用QTimer :: singleShot,但它只适用于没有参数的插槽,我需要不时设置电机速度等参数。
现在我正在使用面向currentTime的延迟功能做dieTime,但跟踪所有设备的时序很复杂。
这样做的最佳解决方案是什么? 建议?
答案 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(特定于域的语言)中完成的。