QThread movetothread汇总
一、线程的生命周期


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



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(); // ✅ 安全

浙公网安备 33010602011771号