浅析 Qt中多线程系列之线程控制 下篇

移动开发
本文介绍的是Qt中多线程系列之线程控制,QThread 是Qt中一个对线程支持的核心的底层类。每个线程对象代表了一个运行的线程。由于Qt的跨平台特性,QThread成功隐藏了所有在不同操作系统里使用线程的平台相关性代码。

Qt中多线程系列之线程控制是本文要介绍的内容,上回讲到线程的初步使用, 浅析 Qt中多线程系列之线程初体验 上篇 写了个线程的创建到运行的过程,可这还没完,线程创建完了之后必须要对其进行限制和控制,我们就是线程的监护人,不能说任由它自由,得对它进行合理约束。接下来我们讲线程的控制部分,

1、线程休眠

 想象一下一种情形,日常用的电脑,如果我们需要离开一段时间,那么可能会将它暂时休眠一下,为了节约用电,也响应一下环境保护,别忘了现在都讲低炭生活。那么线程其实也一样,如果一个线程暂时不需要用到,我们可以先让它睡会,其目的也是为了让它暂时不要占用资源,主要是一个cpu时间片的占用问题。
 
 对于线程的休眠,只要简单调用 Qthread 的sleep ,msleep或者usleep 方法就可以了,注意这三个方法都是Static Protected的,这意味着你只能在继承类里做这个动作,它们差别仅是时间单位不同而已。

程序方面我们尽量简单点,能看清本质就可以了,在Qthread 派生类的Run方法里面用下

  1. void CThread::run()    
  2.  {    
  3.     for(int i=1;i<=10000;i++)   
  4.      {    
  5.        qDebug()<<i;    
  6.        sleep(1); //请不要那么快,睡一下再往下执行    
  7.      }    
  8.  }  

2、线程唤醒

既然有线程的休眠,那就有唤醒。如果你已经和线程说 Sleep 10秒吧,突然人家睡到一半的时候,你又改变主意想让它醒过来,这里我要抱歉的说声是没办法的,它就像猪一样,没到时间是不会醒的。比较合适的方案就是线程同步能够解决这样的问题,这个放到 下一篇 线程的同步[1/2]  的时候再说.只要记住sleep是强制休眠就可以,但现在没办法提供强制唤醒的办法.

3、线程关闭

如果一个线程运行完了它会自己结束自己的生命。可很多情况不是这么简单,一个线程跑到中间的时候由于某种特殊原因,就想它中止。

(1)线程中止方式

中止有两种方式 强制中止和  优雅中止,这用词可能有点不恰当,先这么说着。在说明这两种方式之前,有必要详细说一下线程关闭的时候它到底干了什么。

线程关闭的时候,OS会移除这个线程,这部分对我们是透明的,详细的说明还得参阅操作系统的有关书籍,接着线程中分配的堆栈信息将一并清除,但是如果是堆上分配的信息,得由你负责自己清除,因为堆是由进程持有的,它的生命周期和线程没关系。

(2)强制中止:

 简单的调用Qthread 的方法terminate就可以进行强制中止,可这将会带来很多灾难性的后果。最为严重的就是一个堆内存泄露的问题,线程强制被中止,根本没法来得及做清理工作,即使你的线程 中有执行到最后清理堆内存,可它没来得及执行

比如以下一段代码

  1. void CThread::run()    
  2.  {    
  3.      int *c = new int;    
  4.      for(int i=1;i<=10000;i++)    
  5.      {    
  6.        qDebug()<<i;    
  7.      }    
  8.      //clean    
  9.     delete c;    
  10.  }  

想象一下线程还没执行 到 delete c;的时候你就发出了terminate,不幸的事就发生了,由此得出结论我们应该尽最大限度避免去使用。
 
(3)优雅的中止:
 
那么怎么优雅的关闭线程呢?我们应该通知线程,让线程自己去接手关闭,各自关注自己所需的事,就都能做得更好,一手抓就会带来很多问题
 
那么怎么通知线程呢? 一般会采用以下的步骤

1.在Qthread中派生类 定义一个公用方法出来 供中止时调用,比如stop()

2.调用者 直接 调用stop方法

3.派生类stop方法 ,设置 中止标志,一般就是bool成员

4.run方法 运行的时候,检查bool成员,判断是否需要退出进程,最后做清理工作

  1. //CThread.h  
  2. #ifndef CTHREAD_H    
  3. #define CTHREAD_H    
  4. #include <QThread>    
  5.  class CThread : public QThread    
  6.  {    
  7.  public:    
  8.     CThread();    
  9.      ~CThread();    
  10.     void stop();    
  11.  protected:    
  12.      void run();    
  13.  private:    
  14.      bool mStop;    
  15.  };    
  16.  #endif // CTHREAD_H  
  17.  
  18. //CThread.cpp  
  19. #include <QDebug>    
  20.  #include "CThread.h"    
  21.  CThread::CThread():QThread(),mStop(false)    
  22. {    
  23.  }    
  24.  CThread::~CThread()    
  25.  {    
  26.      stop();    
  27. }    
  28.   void CThread::run()    
  29.   {    
  30.     int *c = new int;    
  31.      for(int i=1;i<=10000;i++)    
  32.     {    
  33.        if (mStop) //  determine to exit the loop    
  34.         {    
  35.            break;    
  36.         }    
  37.         qDebug()<<i;    
  38.        sleep(1);    
  39.      }    
  40.      //clean up    
  41.      delete c;    
  42.  }    
  43.   void CThread::stop()    
  44.   {    
  45.      mStop = true;    
  46.      wait();    
  47.  }  

小结:关于Qt多线程系列之线程控制 下篇的内容介绍完了,也可参考 浅析 Qt中多线程系列之线程初体验 上篇 ,最后希望本文对你有所帮助。

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-24 11:03:31

Qt 多线程 线程

2011-06-22 16:08:40

Qt 多线程 事件循环

2009-08-28 16:51:32

C#线程控制

2023-06-07 13:49:00

多线程编程C#

2009-08-17 16:56:51

C#多线程控制进度条

2011-06-22 14:47:51

QT 多线程 QObject

2011-06-13 10:03:19

Qt 多线程 编程

2009-08-17 16:49:46

C#多线程控制

2023-06-09 07:59:37

多线程编程锁机制

2010-02-01 17:25:09

Python多线程

2023-06-08 08:21:08

多线程编程线程间通信

2011-06-30 17:31:32

Qt 多线程 信号

2009-03-12 10:52:43

Java线程多线程

2011-06-22 14:38:09

QT 多线程 线程安全

2011-06-20 13:43:08

Qt Socket 线程

2009-08-12 18:04:44

编写C#多线程

2009-08-17 16:29:56

C#多线程控制

2009-08-17 16:41:03

C#多线程控制

2023-06-05 07:56:10

线程分配处理器

2023-06-06 08:17:52

多线程编程Thread类
点赞
收藏

51CTO技术栈公众号