我在Windows7平台上使用Qt5 我有一个24/24运行的应用程序,它应该连接到一些远程设备,以打开或关闭它们上的服务。通过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连接到远程设备(正在侦听某个端口)的一些简单命令。 我还在权衡如何实现它......(单线程,多线程,并发等)。
答案 0 :(得分:1)
调度程序的基本实现将包含即将执行的任务列表(在您的案例中可能只有两个项目),按照需要执行这些任务的时间进行排序。由于您使用的是Qt,因此可以使用QDateTime个对象来表示即将完成的任务所需的时间。
设置完列表之后,只需计算当前时间与列表中第一项的时间戳之间剩余的秒数,然后等待该秒数。 QDateTime::secsTo()方法在这里非常有用,因为它只会为您计算。然后,您可以调用QTimer::singleShot()进行调整,以便在那么多秒内发出信号。
当发出qTimer的信号并调用slot-method时,slot方法将检查列表中第一项的QDateTime;如果当前时间大于或等于该项目的QDateTime,那么是时候执行任务了,弹出那个项目从列表的头部开始(可能明天重新安排一个新任务?)。重复直到列表为空或列表中的第一项具有仍在将来的QDateTime,在这种情况下,您将再次返回步骤1。无限期地重复。
请注意,在Qt下完成此任务不需要多线程(并且使用多线程也不会使任务变得更容易,所以如果可能的话我会避免它。)