QThread movetothread汇总

一、线程的生命周期

image

 

image

 QObject::connect(m_SaveImageWorkerThread, &QThread::started, m_SaveImageWorker, &SaveDataRunParameter::SaveImageWorker::SaveImages);

 

image

 

image

 

image

 

quit之后不能让thread执行任务,否则thread->wait()会卡住

例如

下面的语句会卡住thread->wait() 

connect(thread, &QThread::finished, thread, &QObject::deleteLater);    线程无法执行,线程已经退出run

下面的语句则不会卡住thread->wait() 

connect(thread, &QThread::quit, thread, &QObject::deleteLater);

 

二、线程quit()信号发出有以下3种方式

<1>、

m_TestThread->requestInterruption();
// 阻塞当前线程,直到目标线程安全退出
m_TestThread->quit();
m_TestThread->wait();

<2>、在循环函数(例如本文的SaveImages)中直接发出QThread::currentThread()->quit();

<3>、在循环函数(例如本文的SaveImages)中直接发出信号emit SaveWorkFinshed();

之前已经 QObject::connect(m_SaveImageWorker, &SaveImageWorker::SaveWorkFinshed, m_SaveImageWorkerThread, &QThread::quit);

 

三、线程的释放

<1>、QObject::connect(m_SaveImageWorkerThread, &QThread::quit, m_SaveImageWorkerThread, &QObject::deleteLater); // 【核心补充】释放线程内存

<2>、

m_SaveImageWorkerThread->requestInterruption();
m_SaveImageWorkerThread->quit(); // 让 exec() 退出
m_SaveImageWorkerThread->wait(); // 等线程真正结束


// wait() 返回后,线程已经结束,此时安全 delete 线程对象
delete m_SaveImageWorkerThread;
m_SaveImageWorkerThread = nullptr;
m_SaveImageWorker = nullptr;

<3>、智能指针

QSharedPointer<QThread> m_io_thread;

 

<4>、m_SaveImageWorker ->deleteLater()

前提是run()循环事件还在

// 初始化
m_SaveImageWorkerThread = new QThread;
m_SaveImageWorker = new Worker;
m_SaveImageWorker->moveToThread(m_SaveImageWorkerThread);

// 启动事件循环
m_SaveImageWorkerThread->start();

// 停止
m_SaveImageWorkerThread->quit();
m_SaveImageWorkerThread->wait(); // ✅ 等事件循环退出
m_SaveImageWorkerThread->deleteLater(); // ✅ 安全

 

posted @ 2026-09-10 21:45  QuincyYi  阅读(15)  评论(0)    收藏  举报