直接進入主題:
基本用法,建立一個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);
}
結論一:
可以發現,主線程并沒有因為threadStart()的死循環而被阻塞,兩段代碼是運作在不同的線程中。
結論二:
如果将上述emit startThread(); 改為 m_MainThread->threadStart();
即直接調用函數的方式,而非槽函數。結果如下:
可以看出:通過調用函數的方式時,主線程被阻塞,也就是說,調用的函數沒有運作在另一個線程中,而是在主線程。
說明:
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()