Qt多線程——方式1


UI線程為主線程,比較耗時的計算或操作,比如網絡通信中的文件傳輸,在主線程中操作,用戶界面可能會凍結不能及時響應。

多線程應用程序:在上述情況下,可以創建一個單獨的工作線程來執行比較消耗時間的操作,並與主線程之間處理好同步與數據交互

方式一:

QT4.7 之前的版本 : 此版本如果一個線程掛了,退出這個線程,那么線程所對應的函數也退出

  1)工作線程自定義一個類,必須繼承於QThread,線程處理函數和主線程不在同一個線程

    class MyThread:public QThread

    void run() // run()虛函數,需要重寫

    {

       sleep(5); //  父類為QThread,所以不用寫成 QThread::sleep(5)

          emit isDone

    }

  2)  啟動線程,不能直接調用run() ,start()間接調用run()

    Mythread *thread     thread->start()

部分代碼:
  
 1  thread = new mythread(this); //分配空間
 2     connect(thread,&mythread::isDone,this,&pthWidget::DealDone);
 3     connect(this,&mythread::destroyed,this,&mythread::stopthread);  //當按窗口右上角關閉時觸發線程關閉函數
 4 
 5     void pthWidget::stopthread()
 6    {
 7     thread->quit(); //terminate 暴力關閉 容易導致內存問題
 8     thread->wait();//等待線程處理完手頭工作
 9   }
10   void pthWidget::DealDone()
11   {
12       timer->stop(); //處理完數據以后 關閉定時器
13       qDebug()<<"over";
14   }
15   void pthWidget::on_pushButton_clicked()
16   {
17       if(timer->isActive() == false)//如果定時器沒有工作
18             timer->start(100);   //100ms          
19 //    QThread::sleep(50);//非常復雜的數據處理,耗時較長
20 //啟動線程處理數據
21     thread->start();
22 }
23 ///工作線程類
24 #include "mythread.h"
25 mythread::mythread(QObject *parent) : QThread(parent)
26 {
27 }
28 void mythread::run()
29 {
30     sleep(50);//非常復雜的數據處理,耗時較長
31     emit isDone();
32 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM