Qt——线程的生命期问题 1.C对象有生命周期线程也有生命周期QThread对象的生命周期与对应的线程生命周期是否一致2.工程实践中的经验准则线程对象生命周期 对应的线程生命周期MyThread.h#ifndef MYTHREAD_H #define MYTHREAD_H #include QThread class MyThread : public QThread { Q_OBJECT protected: int i; void run(); public: explicit MyThread(QObject *parent nullptr); }; #endif // MYTHREAD_HMyThread.cpp#include MyThread.h MyThread::MyThread(QObject *parent) : QThread{parent} { } void MyThread::run() { this-i 1; for(int i0; i5; i) { this-i * 2; sleep(1); } }main.cpp#include QCoreApplication #include QThread #include QDebug #include MyThread.h #include SyncThread.h void test() { MyThread t; t.start(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main() tid QThread::currentThreadId(); test(); return QCoreApplication::exec(); }运行结果main() tid 0x2030QThread: Destroyed while thread is still running因为t已经被销毁但是t中的run函数仍在执行3.同步型线程设计线程对象主动等待线程生命期结束后才销毁同时支持在栈和堆中创建线程对象对象销毁时确保线程生命期结束要点在析构函数中先调用wait()函数强制等到线程运行结束使用场合线程生命期相对较短的情形SyncThreadh#ifndef SYNCTHREAD_H #define SYNCTHREAD_H #include QThread class SyncThread : public QThread { Q_OBJECT protected: void run(); public: explicit SyncThread(QObject *parent nullptr); ~SyncThread(); }; #endif // SYNCTHREAD_HSyncThread.cpp#include SyncThread.h #include QDebug SyncThread::SyncThread(QObject *parent) : QThread{parent} { } void SyncThread::run() { qDebug() void SyncThread::run() tid currentThreadId(); for(int i0; i3; i) { qDebug() void SyncThread::run() i i; sleep(1); } qDebug() void SyncThread::run() end; } SyncThread::~SyncThread() { wait(); qDebug() SyncThread::~SyncThread() destroy thread object; }main.cpp#include QCoreApplication #include QThread #include QDebug #include MyThread.h #include SyncThread.h void test() { MyThread t; t.start(); } void sync_thread() { SyncThread st; st.start(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main() tid QThread::currentThreadId(); sync_thread(); return QCoreApplication::exec(); }运行结果main() tid 0xe84void SyncThread::run() tid 0x3430void SyncThread::run() i 0void SyncThread::run() i 1void SyncThread::run() i 2void SyncThread::run() endSyncThread::~SyncThread() destroy thread object4.异步型线程设计在run()中最后调用deleteLater()函数线程体函数主动申请销毁线程对象使用场合线程生命期不可控需要长时间运行于后台的情形注意deleteLater()只对堆对象有效对栈对象无效AsyncThread.h#ifndef ASYNCTHREAD_H #define ASYNCTHREAD_H #include QThread class AsyncThread : public QThread { Q_OBJECT protected: void run(); public: explicit AsyncThread(QObject *parent 0); ~AsyncThread(); }; #endif // ASYNCTHREAD_HAsyncThread.cpp#include AsyncThread.h #include QDebug AsyncThread::AsyncThread(QObject *parent) : QThread(parent) { } void AsyncThread::run() { qDebug() void AsyncThread::run() tid currentThreadId(); for(int i0; i3; i) { qDebug() void AsyncThread::run() i i; } qDebug() void AsyncThread::run() end; deleteLater(); } AsyncThread::~AsyncThread() { qDebug() AsyncThread::~AsyncThread() destroy thread object; }main.cpp#include QCoreApplication #include QThread #include QDebug #include MyThread.h #include SyncThread.h #include AsyncThread.h void test() { MyThread t; t.start(); } void sync_thread() { SyncThread st; st.start(); } void asyns_thread() { AsyncThread *at new AsyncThread(); at-start(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() main() tid QThread::currentThreadId(); asyns_thread(); return QCoreApplication::exec(); }运行结果main() tid 0x2cf4void AsyncThread::run() tid 0x130cvoid AsyncThread::run() i 0void AsyncThread::run() i 1void AsyncThread::run() i 2void AsyncThread::run() endAsyncThread::~AsyncThread() destroy thread object