Qt5:如何基于每周调度程序执行 "task"?
Qt5: How to execute a "task" based on a weekly scheduler?
我在 Windows7 平台上使用 Qt5。
我有一个应用程序 运行 24/24,它应该连接到一些远程设备以打开或关闭它们的服务。连接通过 TCP 完成。
对于一周中的每一天,is/should 都可以为 operations/tasks 设置小时和分钟:打开服务和关闭服务,如下面的代码所示:
#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
...
也是如此
现在,问题是:
如何根据上述"scheduler"启动open-service和close-service任务?
好的,打开服务和关闭服务任务还没有实现,但它们只是一些简单的命令,通过 TCP 连接到远程设备(正在侦听某个端口)。
我也在权衡如何实现它……(单线程、多线程、并发等)。
调度程序的基本实现将包含即将到来的任务列表(在您的情况下列表中可能只有两个项目),该列表按需要执行这些任务的时间排序。由于您使用的是 Qt,因此可以使用 QDateTime 对象来表示需要完成即将到来的任务的时间。
设置好该列表后,只需计算当前时间与列表中第一项的时间戳之间剩余的秒数,然后等待该秒数即可。 QDateTime::secsTo() method is very useful here as it will do just that calculation for you. You can then call QTimer::singleShot() 以便在 that-many 秒后发出信号。
当发出 qTimer 的信号并调用您的 slot-method 时,您的插槽方法将检查列表中第一项的 QDateTime;如果当前时间大于或等于该项目的 QDateTime,那么就该执行任务了,并将该项目从列表的头部弹出(并可能为明天重新安排一个新任务?)。重复直到列表为空或列表中的第一个项目有一个仍在未来的 QDateTime,在这种情况下,您将再次返回到步骤 1。无限期地重复。
请注意,在 Qt 下完成此任务不需要多线程(并且使用多线程也不会使任务变得更容易,所以我会尽可能避免它)。
我在 Windows7 平台上使用 Qt5。
我有一个应用程序 运行 24/24,它应该连接到一些远程设备以打开或关闭它们的服务。连接通过 TCP 完成。
对于一周中的每一天,is/should 都可以为 operations/tasks 设置小时和分钟:打开服务和关闭服务,如下面的代码所示:
#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
...
现在,问题是:
如何根据上述"scheduler"启动open-service和close-service任务?
好的,打开服务和关闭服务任务还没有实现,但它们只是一些简单的命令,通过 TCP 连接到远程设备(正在侦听某个端口)。
我也在权衡如何实现它……(单线程、多线程、并发等)。
调度程序的基本实现将包含即将到来的任务列表(在您的情况下列表中可能只有两个项目),该列表按需要执行这些任务的时间排序。由于您使用的是 Qt,因此可以使用 QDateTime 对象来表示需要完成即将到来的任务的时间。
设置好该列表后,只需计算当前时间与列表中第一项的时间戳之间剩余的秒数,然后等待该秒数即可。 QDateTime::secsTo() method is very useful here as it will do just that calculation for you. You can then call QTimer::singleShot() 以便在 that-many 秒后发出信号。
当发出 qTimer 的信号并调用您的 slot-method 时,您的插槽方法将检查列表中第一项的 QDateTime;如果当前时间大于或等于该项目的 QDateTime,那么就该执行任务了,并将该项目从列表的头部弹出(并可能为明天重新安排一个新任务?)。重复直到列表为空或列表中的第一个项目有一个仍在未来的 QDateTime,在这种情况下,您将再次返回到步骤 1。无限期地重复。
请注意,在 Qt 下完成此任务不需要多线程(并且使用多线程也不会使任务变得更容易,所以我会尽可能避免它)。