abcdef

构造一个好控制一点的长期工作线程

Qt里面创建线程好简单, 方式很友好很酷, 封装性好强大....

只要定义一个继承于QThread的类就ok了, 然后实现run虚方法, 这个虚方法就是跑在一个新的线程上的; 这个线程要通知父线程消息, 可以直接发射信号就ok了, 超级方便

这里假设要做一个长期的工作线程, 平常没事的时候, 阻塞在那里, 不耗cpu时间, 当有任务的时候, 就执行, 执行完后就阻塞等待下一次任务;

所以初步的程序结构是这样子:

//class xxxThread : public QThread {...};

void
xxxThread::run() { while(true) { //1.等待任务, 如果没任务就阻塞在这里 //2.执行任务 } }

等待任务, 可以用QWaitCondition类来做控制, 它可以配置超时时间, 很好用:

//定义
class xxxThread : QThread {
    ....

protected:
    virtual void run();
private:
    QWaitCondition waitcTask;
    QMutex muxTask;
};

//实现
void xxxThread::run() {
    while(true) {
        QMutexLocker lock(&this->muxTask);
        waitcTask.wait(&this->muxTask);
        //exec task
    }
}

当没任务的时候, run函数线程是阻塞的, 不耗cpu时间; 有任务的时候可以这样控制:

//定义
class xxxThread : QThread {
    ....


public:
    void Test();

protected:
    virtual void run();
private:
    QWaitCondition waitcTask;
    QMutex muxTask;
};

//实现
void xxxThread::Test() {
    //传递一些参数, 通过封装好的对列啊或者其他方式
...
waitcTask.wakeOne(); //执行这, run方法的waitcTask.wait(...)会返回, 不再阻塞
//然后run方法就可以检测其他线程传递过来的数据指令, 根据这, 去判断要执行啥啥啥操作
}


run方法执行操作后, 大多情况要通知父线程的任务结果啊, 此时可以做成简单的, 也可以做成复杂的, 视需求而定了

比如简单的, 直接定义一个特定的信号, 用于表示啥任务结果, 然后执行任务后发射出这个信号就ok了;

比如复杂点的, 定义一个消息队列, 可以保存一系列的任务结果类型数据, 然后定义一个通用的信号, 只要run方法发射出这个信号, 父线程收到信号后就开始读取这个消息队列, 分析返回的数据; 中间注意好同步就ok了... o_O

 

还有, 一般都有这个意识, 不在ui线程执行一些很耗时的任务, 一般放到工作线程去执行; 但像上班那样的工作线程, 如果在执行一件很耗时的任务, 那么就会不利于后续对该线程的控制;

比如线程在执行一个操作, 要大概10分钟才能完全执行完毕; 如果中间ui线程接到退出程序指令, 此时ui线程却无法通知工作线程要中断任务退出; 只能强杀线程? 太tnnd暴力了;

所以, 工作线程最好是能够这样: 执行阻塞任务要有超时功能, 要能短时间内相应一些立即任务.....这个有时候挺难实现出来额额额额额额额...

 

 

 

posted @ 2013-03-05 13:15  jianc  阅读(352)  评论(0编辑  收藏  举报