Qt中线程的生命期问题
生活随笔
收集整理的這篇文章主要介紹了
Qt中线程的生命期问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 Qt中線程的生命期問題
- 1.1 Qt中線程的生命期問題
- 1.2 同步型線程設(shè)計
- 1.3 在異步型線程設(shè)計
1 Qt中線程的生命期問題
1.1 Qt中線程的生命期問題
一個工程中實際的問題:
- C++對象有生命周期,線程也有生命周期,QThread對象的生命周期與所對應(yīng)的線程生命周期是否一致?
工程實踐中的經(jīng)驗準(zhǔn)則:
下面的代碼有問題嗎?
運行結(jié)果:
1.2 同步型線程設(shè)計
概念:
- 線程對象主動等待線程生命周期結(jié)束后才銷毀。
特點:
- 同時支持在棧和堆中創(chuàng)建線程對象。
- 對象銷毀時確保線程生命期結(jié)束。
要點:
- 在析構(gòu)函數(shù)中先調(diào)用wait()函數(shù),強(qiáng)制等到線程運行結(jié)束。
使用場合:
- 線程生命期相對較短的情形。
SyncThread.h:
SyncThread.cpp:
#include "SyncThread.h" #include <QDebug>SyncThread::SyncThread(QObject *parent) :QThread(parent) { }void SyncThread::run() {qDebug() << "void SyncThread::run() tid = " << currentThreadId();for(int i=0; i<3; i++){qDebug() << "void SyncThread::run() i = " << i;sleep(1);}qDebug() << "void SyncThread::run() end"; }SyncThread::~SyncThread() {wait();qDebug() << "SyncThread::~SyncThread() destroy thread object"; }1.3 在異步型線程設(shè)計
要點:
- 在run()中最后調(diào)用deleteLater()函數(shù)。
- 線程體函數(shù)主動申請銷毀線程對象。
使用場合:
- 線程生命期不可控,需要長時間運行于后臺的情形。
注:
- deleteLater()只是向當(dāng)前對象所依附的線程事件循環(huán)隊列中加入了一個刪除自己的請求。
AsyncThread.h:
#ifndef ASYNCTHREAD_H #define ASYNCTHREAD_H#include <QThread>class AsyncThread : public QThread {Q_OBJECTprotected:void run();explicit AsyncThread(QObject *parent = 0);~AsyncThread();public:static AsyncThread* NewInstance(QObject *parent = 0);};#endif // ASYNCTHREAD_HAsyncThread.cpp:
#include "AsyncThread.h" #include <QDebug>AsyncThread* AsyncThread::NewInstance(QObject *parent) {return new AsyncThread(parent); }AsyncThread::AsyncThread(QObject *parent) :QThread(parent) { }void AsyncThread::run() {qDebug() << "void AsyncThread::run() tid = " << currentThreadId();for(int i=0; i<3; i++){qDebug() << "void AsyncThread::run() i = " << i;sleep(1);}qDebug() << "void AsyncThread::run() end";deleteLater(); }AsyncThread::~AsyncThread() {qDebug() << "AsyncThread::~AsyncThread() destroy thread object"; }總結(jié)一下:
- 線程對象生命期必須大于對象線程生命期。
- 同步型線程設(shè)計-線程生命期較短。
- 異步型線程設(shè)計-線程生命期不可控。
- 線程類的設(shè)計必須適應(yīng)具體的場合。
- 沒有萬能的設(shè)計,只有合適的設(shè)計。
參考資料:
總結(jié)
以上是生活随笔為你收集整理的Qt中线程的生命期问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 堆的原理及实现
- 下一篇: Qt中另一种创建线程的方式