博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造一个好控制一点的长期工作线程
阅读量:5037 次
发布时间:2019-06-12

本文共 1612 字,大约阅读时间需要 5 分钟。

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

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

 

 

 

转载于:https://www.cnblogs.com/jianc/archive/2013/03/05/2944159.html

你可能感兴趣的文章
matlab新手入门(二)(翻译)
查看>>
Python 编码规范 PEP8
查看>>
mac os 下安装 nmap网络扫描和嗅探工具包
查看>>
python 迷宫问题
查看>>
Ubuntu 14.04 源
查看>>
android界面开发那点事
查看>>
js事件基础
查看>>
玩转CPU Topology
查看>>
jquery实现可以中英切换的导航条
查看>>
ConcurrentHashMap源码解析(JDK1.8)
查看>>
设计模式之中介者模式
查看>>
JavaScript动态清除
查看>>
SVN的忽略和只读使用方法学习记录
查看>>
smartupload 上传与下载(转载)
查看>>
Module
查看>>
Android TextView : “Do not concatenate text displayed with setText”
查看>>
SpringCloud Feign异常处理
查看>>
python接口自动化测试三十五:用BeautifulReport生成报告
查看>>
Microsoft Visual Studio is waiting for an internal operation to complete 解决方法
查看>>
Spark Streaming笔记整理(二):案例、SSC、数据源与自定义Receiver
查看>>