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 }