成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析 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 多線程 線程

2009-08-28 16:51:32

C#線程控制

2011-06-22 16:08:40

Qt 多線程 事件循環

2023-06-07 13:49:00

多線程編程C#

2011-06-22 14:47:51

QT 多線程 QObject

2009-08-17 16:56:51

C#多線程控制進度條

2011-06-13 10:03:19

Qt 多線程 編程

2010-02-01 17:25:09

Python多線程

2023-06-09 07:59:37

多線程編程鎖機制

2009-08-17 16:49:46

C#多線程控制

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 多線程 線程安全

2009-08-12 18:04:44

編寫C#多線程

2011-06-20 13:43:08

Qt Socket 線程

2023-06-05 07:56:10

線程分配處理器

2023-06-06 08:17:52

多線程編程Thread類

2009-08-17 16:41:03

C#多線程控制

2009-08-17 16:29:56

C#多線程控制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品色欧美aⅴ一区二区 | 精品欧美一区免费观看α√ | 亚洲毛片一区二区 | 青青草av网站 | 亚洲天堂av在线 | 美女视频一区二区三区 | a级免费黄色片 | 亚洲精品一区二区在线观看 | 欧美色欧美亚洲另类七区 | 成人午夜影院 | 97超碰人人草 | 日韩免费看视频 | 精品久久香蕉国产线看观看亚洲 | 亚洲国产精品va在线看黑人 | 日韩精品一区二区三区 | 日韩精品1区2区3区 爱爱综合网 | 涩涩鲁亚洲精品一区二区 | 日韩在线综合网 | 91精品久久久久久久久久入口 | 日韩精品在线一区二区 | 亚洲国产二区 | 久久国产综合 | 午夜小电影 | 欧美精品在线播放 | 久久机热 | 久草网站 | 欧美色视频免费 | 国产一区不卡在线观看 | 国产成人精品亚洲日本在线观看 | 91视频一区二区三区 | 国产高清在线精品 | 91久久国产综合久久 | 欧美日本一区 | 久久国产精品久久久久 | 欧美激情区 | 国产1区2区 | 在线黄| 日韩av黄色 | 一区二区三区免费 | 亚洲天堂日韩精品 | 国产a视频 |