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方法就可以检测其他线程传递过来的数据指令, 根据这, 去判断要执行啥啥啥操作}
比如简单的, 直接定义一个特定的信号, 用于表示啥任务结果, 然后执行任务后发射出这个信号就ok了;
比如复杂点的, 定义一个消息队列, 可以保存一系列的任务结果类型数据, 然后定义一个通用的信号, 只要run方法发射出这个信号, 父线程收到信号后就开始读取这个消息队列, 分析返回的数据; 中间注意好同步就ok了... o_O
还有, 一般都有这个意识, 不在ui线程执行一些很耗时的任务, 一般放到工作线程去执行; 但像上班那样的工作线程, 如果在执行一件很耗时的任务, 那么就会不利于后续对该线程的控制;
比如线程在执行一个操作, 要大概10分钟才能完全执行完毕; 如果中间ui线程接到退出程序指令, 此时ui线程却无法通知工作线程要中断任务退出; 只能强杀线程? 太tnnd暴力了;
所以, 工作线程最好是能够这样: 执行阻塞任务要有超时功能, 要能短时间内相应一些立即任务.....这个有时候挺难实现出来额额额额额额额...