zoukankan      html  css  js  c++  java
  • 构造一个好控制一点的长期工作线程

    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暴力了;

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

  • 相关阅读:
    mongo
    CSS常用属性
    nginx-proxy_cache缓存
    nginx防盗链
    oracle11g-centos部署
    VLAN高级特性
    路由
    网络摄像头分辨率
    前端开发调试线上代码的两款工具
    sql中 in , not in , exists , not exists效率分析
  • 原文地址:https://www.cnblogs.com/jianc/p/2944159.html
Copyright © 2011-2022 走看看