天天看點

QT 線程之 moveToThread()

直接進入主題:

基本用法,建立一個Widget類(父類無要求) ,在此基礎上建立一個TestThread(必須繼承自 QObject),

在Widget類構造函數裡做如下處理:

m_TestThread = new TestThread();
m_thread = new QThread();
m_TestThread ->moveToThread(m_thread);
m_thread->start();//以上是必須滴

connect(this,SIGNAL(startThread()),m_TestThread ,SLOT(threadStart()));
emit startThread(); //發送信号,執行槽函數threadStart()
int i= 0;
 while(1){
         qDebug() <<"mainThread:"<<i++<<QThread::currentThreadId()<< endl;
         QThread::msleep(1000);
    }
           

TestThread類threadStart()槽函數代碼

int i = 0;
 while(1){
		qDebug() <<"m_thread:"<< i++<< QThread::currentThreadId()<< endl;
		QThread::msleep(1000);
    }
           

結論一:

QT 線程之 moveToThread()

可以發現,主線程并沒有因為threadStart()的死循環而被阻塞,兩段代碼是運作在不同的線程中。

結論二:

如果将上述emit startThread(); 改為 m_MainThread->threadStart();

即直接調用函數的方式,而非槽函數。結果如下:

QT 線程之 moveToThread()

可以看出:通過調用函數的方式時,主線程被阻塞,也就是說,調用的函數沒有運作在另一個線程中,而是在主線程。

說明:

1. 線程函數的 while循環結束 并不代表 線程結束

2.m_thread->isRunning() 可以判斷 線程是否在運作

3.m_thread->isFinished() 可以判斷 線程 是否結束

4.started() 線程被start時觸發的信号

5.finished() 線程被stop時觸發的信号

6.線程退出的方法

m_thread->quit();

m_thread->exit();

兩者異同暫不讨論

7.等待線程結束,即阻塞

m_thread->wait()