精英盒子 -> 程序设计 -> 自己写了个一个任务队列类 [打印本页]

jybox 2012-05-22 21:42

自己写了个一个任务队列类

如题,我的需求是这样的,我需要为我的vps,神马终端写一个自动化的管理工具,有很多任务需要定时运行,但是要求不尽相同
有的要求每隔一段时间运行,有的要求固定在每天的某个时刻运行,有的要求隔几天在某个时刻运行
于是写了这么一个类,可以利用Qt的信号槽,按照要求进行调度

ps.其实这东西直接用linux的cron会更方便点?

源文件有两个,一个头文件,一个实现文件:
https://github.com/jybox/MyWorks/blob/master/WhatBackuper/TaskQueue.h
https://github.com/jybox/MyWorks/blob/master/WhatBackuper/TaskQueue.cpp


class Task:public QObject
{
    Q_OBJECT
    //Task类表示一个任务
public:
    bool isPerOrAt;//是隔一段时间运行,还是定时运行
    int perSec;//如果是隔一段时间运行,隔多少秒
    QTime atTime;//如果是定时运行,在什么时刻
    int atTimePerDays;//如果是定时运行,隔多少天
    unsigned int lastRunTime;//上一次运行这个任务的时间
    QTimer timer;//定时器
    QString name;//任务的名字
    QObject *receiver;//接收信号的对象
    QString slot;//接收信号的槽
public slots:
    void timeout();//链接到timer的timeout信号
};


class TaskQueue:public QObject
{
    //这个就是任务队列类了
    Q_OBJECT
public:
    explicit TaskQueue();
    void addPerSec(QString name,int sec,QObject *receiver,QString slot);//添加一个隔一段时间运行的任务
    void addAtTime(QString name,QTime time,int perDays,QObject *receiver,QString slot);//添加一个定时运行的任务
    bool remove(QString name);//删除任务

    void setUpTask(QString name,QObject *receiver,QString slot);

    QMap<QString,Task*> taskList;//用来保存任务信息
};

实现文件不贴了...
用法:
比如我需要每隔30秒,调用core对象的timeout槽,可以这么写:
TaskQueue queue;
queue.addPerSec("任务名",30,core,SLOT(timeout));
这里的任务名只是起到一个标识的作用,可以在删除任务时用到

比如需要每天9点,调用core对象的timeout槽,可以这么写:
queue.addAtTime("任务名",QTime(9,0,0),1,core,SLOT(timeout));
第三参数1,表示每天运行

如果需要每隔三天的9点,调用core对象的timeout槽,可以这么写:
queue.addAtTime("任务名",QTime(9,0,0),3,core,SLOT(timeout));

jybox 2012-05-22 21:43
Qt的QTimer类其实有类似addPerSec的功能...

whtsky 2012-05-22 22:18
你知道什么叫任务队列么?
您这叫计划任务啊。

jybox 2012-05-22 22:55
whtsky:你知道什么叫任务队列么?
您这叫计划任务啊。 (2012-05-22 22:18) 

好吧




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.039224 second(s),query:5 Gzip enabled