2. 线程生命周期管理
任务目标
实现一个Worker线程类,演示Qt线程的完整生命周期管理:启动(start())、等待(wait())、强制终止(terminate()),并通过信号槽机制观察线程在不同阶段的状态变化。
核心实现
// worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QThread>
#include <QMutex>
class Worker : public QThread
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr);
~Worker() override;
// 线程状态枚举
enum class LifeState {
Idle, // 未启动
Running, // 运行中
Finishing, // 即将退出
Terminated // 被强制终止
};
signals:
void stateChanged(LifeState state);
void progress(int value);
protected:
void run() override;
private:
QMutex m_mutex;
bool m_stopFlag = false;
};
#endif // WORKER_H
// worker.cpp
#include "worker.h"
#include <QDebug>
Worker::Worker(QObject *parent)
: QThread(parent)
{
}
Worker::~Worker()
{
// 析构时确保线程已结束
if (isRunning()) {
terminate();
wait();
}
}
void Worker::run()
{
emit stateChanged(LifeState::Running);
qDebug() << "线程开始执行, ID:" << currentThreadId();
// 模拟耗时工作:循环50次,每次休眠20ms
for (int i = 0; i < 50; ++i) {
{
QMutexLocker locker(&m_mutex);
if (m_stopFlag) {
break;
}
}
msleep(20);
emit progress(i + 1);
}
emit stateChanged(LifeState::Finishing);
qDebug() << "线程正常结束";
}
// 供外部调用的终止请求(安全方式)
void requestInterruption()
{
QMutexLocker locker(&m_mutex);
m_stopFlag = true;
}
// main.cpp - 完整可运行示例
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include "worker.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Worker worker;
QObject::connect(&worker, &Worker::stateChanged,
[](Worker::LifeState state) {
switch (state) {
case Worker::LifeState::Running:
qDebug() << "[状态] 线程运行中";
break;
case Worker::LifeState::Finishing:
qDebug() << "[状态] 线程正常结束";
break;
case Worker::LifeState::Terminated:
qDebug() << "[状态] 线程被强制终止";
break;
default:
break;
}
});
QObject::connect(&worker, &Worker::progress,
[](int value) {
if (value % 10 == 0) // 每10次打印一次进度
qDebug() << "进度:" << value << "/50";
});
// 1. 启动线程
qDebug() << "=== 启动线程 ===";
worker.start();
// 2. 等待线程执行约300ms后请求中断
QThread::msleep(300);
qDebug() << "=== 请求线程中断 ===";
worker.requestInterruption();
// 3. 等待线程结束(最多等待2秒)
qDebug() << "=== 等待线程结束 ===";
bool finished = worker.wait(2000);
qDebug() << "线程是否在2秒内结束:" << finished;
// 4. 演示强制终止(新建一个线程实例)
Worker worker2;
QObject::connect(&worker2, &Worker::stateChanged,
[](Worker::LifeState state) {
if (state == Worker::LifeState::Running)
qDebug() << "[状态] 线程2运行中";
});
qDebug() << "=== 启动线程2并强制终止 ===";
worker2.start();
QThread::msleep(50); // 让线程2运行一小段时间
worker2.terminate(); // 强制终止
worker2.wait(); // 等待终止完成
qDebug() << "线程2 isRunning:" << worker2.isRunning()
<< " isFinished:" << worker2.isFinished();
return 0;
}
工程配置
在.pro文件中添加:
QT += core
CONFIG += console c++17
TARGET = lifecycle_demo
SOURCES += main.cpp worker.cpp
HEADERS += worker.h
运行与验证
- 编译运行:
qmake && make && ./lifecycle_demo - 观察输出:程序依次打印线程启动、运行中状态、进度信息、中断请求、等待结果,以及线程2的强制终止过程。
- 判定通过条件:
- 线程1在约300ms后收到中断请求,
wait(2000)返回true,且打印“线程正常结束”; - 线程2被
terminate()后,isRunning()为false,isFinished()为true; - 程序无崩溃、无死锁,正常退出。
- 线程1在约300ms后收到中断请求,
关键说明
- 安全终止:通过
requestInterruption()设置标志位,线程在循环中检查并自行退出,这是推荐方式。 - 强制终止:
terminate()是危险操作,可能造成资源泄漏或死锁,仅用于无法响应中断的紧急场景。本示例仅用于演示其效果。 - 状态观察:通过信号
stateChanged实时反馈线程生命周期变化,这是Qt线程通信的推荐模式。