Qt5:如何根据每周调度程序执行“任务”?

时间:2016-01-07 23:32:30

标签: multithreading qt task schedule concurrent-programming

我在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连接到远程设备(正在侦听某个端口)的一些简单命令。 我还在权衡如何实现它......(单线程,多线程,并发等)。

1 个答案:

答案 0 :(得分:1)

调度程序的基本实现将包含即将执行的任务列表(在您的案例中可能只有两个项目),按照需要执行这些任务的时间进行排序。由于您使用的是Qt,因此可以使用QDateTime个对象来表示即将完成的任务所需的时间。

设置完列表之后,只需计算当前时间与列表中第一项的时间戳之间剩余的秒数,然后等待该秒数。 QDateTime::secsTo()方法在这里非常有用,因为它只会为您计算。然后,您可以调用QTimer::singleShot()进行调整,以便在那么多秒内发出信号。

当发出qTimer的信号并调用slot-method时,slot方法将检查列表中第一项的QDateTime;如果当前时间大于或等于该项目的QDateTime,那么是时候执行任务了,弹出那个项目从列表的头部开始(可能明天重新安排一个新任务?)。重复直到列表为空或列表中的第一项具有仍在将来的QDateTime,在这种情况下,您将再次返回步骤1。无限期地重复。

请注意,在Qt下完成此任务不需要多线程(并且使用多线程也不会使任务变得更容易,所以如果可能的话我会避免它。)