moveToThread
該函數(shù)屬于QObject,因此任何繼承于QObject的對象都可以使用該函數(shù)。
使用該函數(shù)可以減少主線程界面刷新的壓力
官方解釋:
1:
更改此對象及其子對象的線程相關(guān)性。如果對象有父對象,則無法移動該對象。事件處理將在targetThread中繼續(xù)。
解釋:每一個(gè)QObject對象都有事件循環(huán),默認(rèn)子類事件是可以傳遞給父類的,界面(或者說是每一個(gè)部件)更新,調(diào)用的是就重繪事件(paint),正常而言我們只有一個(gè)主線程(一個(gè)事件循環(huán)),也就是main()函數(shù)中啟動的QApplication::exec()。此時(shí)界面上的所有控件的鼠標(biāo)、鍵盤相應(yīng)事件,重繪事件(刷新界面)等都是在主線程中進(jìn)行。
如果我們創(chuàng)建了一個(gè)新的QThread線程,之后將一個(gè)沒有父對象的QObject調(diào)用moveToThread函數(shù)移動到這個(gè)線程中的話,那個(gè)這個(gè)QObject的事件循環(huán)就會運(yùn)行在這個(gè)子線程中,也就是這個(gè)控件的刷新,各種事件響應(yīng)函數(shù)都會在這個(gè)子線程中運(yùn)行,包括這個(gè)空間發(fā)射的信號也是從子線程中發(fā)射的。
2:
要將對象移動到主線程,請使用QApplication::instance()來檢索指向當(dāng)前應(yīng)用程序的指針,然后使用QAApplication::thread()來獲取應(yīng)用程序所在的線程。例如:myObject->moveToThread(QApplication::instance()->thread());
解釋:一種方式,將已經(jīng)移動到子線程中的QObject對象重新移動回主線程
3:
如果targetThread為nullptr,則此對象及其子對象的所有事件處理都將停止,因?yàn)樗鼈儾辉倥c任何線程關(guān)聯(lián)。
解釋:如果我們在移動QObject對象時(shí),targetThread(nullptr)傳入了一個(gè)空的對象,則這個(gè)QObject將沒有線程來負(fù)責(zé)他的事假循環(huán),將不會有任何響應(yīng)
4:
請注意,對象的所有活動計(jì)時(shí)器都將重置。計(jì)時(shí)器首先在當(dāng)前線程中停止,然后在targetThread中重新啟動(間隔相同)。因此,在線程之間不斷移動對象可以無限期地推遲計(jì)時(shí)器事件。
QEvent::ThreadChange事件在線程相關(guān)性更改之前發(fā)送到此對象。您可以處理此事件以執(zhí)行任何特殊過程文章來源:http://www.zghlxwxcb.cn/news/detail-652840.html
解釋:QTimer有關(guān)的解釋文章來源地址http://www.zghlxwxcb.cn/news/detail-652840.html
到了這里,關(guān)于Qt:moveToThread的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!