我在Windows7平台上使用Qt5
我有一个全天候运行的应用程序,它应该连接到一些远程设备,以便打开或关闭它们上的服务。连接是通过TCP完成的
对于一周中的每一天,都有/应该有设置小时&两种操作/任务的分钟数:打开服务和关闭服务,如下代码所示:
#define SUNDAY 0
#define MONDAY 1
//...
#define SATURDAY 6
struct Day_OpenCloseService
{
bool automaticOpenService;
int openHour;
int openMinute;
bool automaticCloseService;
int closeHour;
int closeMinute;
};
QVector<Day_OpenCloseService> Week_OpenCloseService(7);
Week_OpenCloseService[SUNDAY].automaticOpenService = true;
Week_OpenCloseService[SUNDAY].openHour = 7;
Week_OpenCloseService[SUNDAY].openMinute = 0;
Week_OpenCloseService[SUNDAY].automaticCloseService = false;
//
Week_OpenCloseService[MONDAY].automaticOpenService = true;
Week_OpenCloseService[MONDAY].openHour = 4;
Week_OpenCloseService[MONDAY].openMinute = 30;
Week_OpenCloseService[MONDAY].automaticCloseService = true;
Week_OpenCloseService[MONDAY].closeHour = 23;
Week_OpenCloseService[MONDAY].closeMinute = 0;
// ...
Week_OpenCloseService[SATURDAY].automaticOpenService = true;
Week_OpenCloseService[SATURDAY].openHour = 6;
Week_OpenCloseService[SATURDAY].openMinute = 15;
Week_OpenCloseService[SATURDAY].automaticCloseService = false;
Week_OpenCloseService[SATURDAY].closeHour = 23;
Week_OpenCloseService[SATURDAY].closeMinute = 59;
如果automaticOpenService
在一天内为真,则将在指定的时间执行开放服务;分钟,在一个新的线程中(我想)
如果automaticOpenService
为false,则一周中的该天不执行任何打开的服务automaticCloseService
也是如此。。。
现在,问题是: 好的,开放服务和关闭服务任务还没有实现,但它们只是通过TCP连接到远程设备(在某个端口上侦听)的一些简单命令
如何根据上述"调度程序"启动打开服务和关闭服务
我仍在权衡如何实现这一点。。。(单线程、多线程、并发等)。
调度程序的基本实现将保存一个即将执行的任务列表(在您的情况下,列表中可能只有两项),并根据这些任务需要执行的时间进行排序。由于您使用的是Qt,因此可以使用QDateTime对象来表示需要完成即将完成的任务的时间。
一旦你设置了这个列表,只需要计算当前时间和列表中第一个项目的时间戳之间还有多少秒,然后等待这个秒数。QDateTime::secsTo()方法在这里非常有用,因为它只会为您进行计算。然后可以调用QTimer::singleShot(),使其在几秒钟内发出信号。
当qTimer的信号发出并调用slot方法时,slot方法将检查列表中第一项的QDateTime;如果当前时间大于或等于该项目的QDateTime,那么是时候执行该任务了,并将该项目从列表的顶部弹出(也许会重新安排明天的新任务?)。重复此操作,直到列表为空,或者列表中的第一个项目的QDateTime仍在将来,在这种情况下,您将再次返回步骤1。无限期重复。
注意,在Qt下完成这项任务不需要多线程(使用多线程也不会让任务变得更容易,所以如果可能的话,我会避免)。