日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt中线程的生命期问题

發布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中线程的生命期问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 Qt中線程的生命期問題
      • 1.1 Qt中線程的生命期問題
      • 1.2 同步型線程設計
      • 1.3 在異步型線程設計

1 Qt中線程的生命期問題

1.1 Qt中線程的生命期問題

一個工程中實際的問題:

  • C++對象有生命周期,線程也有生命周期,QThread對象的生命周期與所對應的線程生命周期是否一致?

工程實踐中的經驗準則:

下面的代碼有問題嗎?

運行結果:

1.2 同步型線程設計

概念:

  • 線程對象主動等待線程生命周期結束后才銷毀。

特點:

  • 同時支持在棧和堆中創建線程對象。
  • 對象銷毀時確保線程生命期結束。

要點:

  • 在析構函數中先調用wait()函數,強制等到線程運行結束。

使用場合:

  • 線程生命期相對較短的情形。

    SyncThread.h:
#ifndef SYNCTHREAD_H #define SYNCTHREAD_H#include <QThread>class SyncThread : public QThread {Q_OBJECTprotected:void run();public:explicit SyncThread(QObject *parent = 0);~SyncThread(); };#endif // 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 在異步型線程設計

要點:

  • 在run()中最后調用deleteLater()函數。
  • 線程體函數主動申請銷毀線程對象。

使用場合:

  • 線程生命期不可控,需要長時間運行于后臺的情形。


注:

  • deleteLater()只是向當前對象所依附的線程事件循環隊列中加入了一個刪除自己的請求。

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_H

AsyncThread.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"; }

總結一下:

  • 線程對象生命期必須大于對象線程生命期。
  • 同步型線程設計-線程生命期較短。
  • 異步型線程設計-線程生命期不可控。
  • 線程類的設計必須適應具體的場合。
  • 沒有萬能的設計,只有合適的設計。

參考資料:

  • QT實驗分析教程
  • 總結

    以上是生活随笔為你收集整理的Qt中线程的生命期问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。