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

运行与验证

  1. 编译运行:qmake && make && ./lifecycle_demo
  2. 观察输出:程序依次打印线程启动、运行中状态、进度信息、中断请求、等待结果,以及线程2的强制终止过程。
  3. 判定通过条件:
    • 线程1在约300ms后收到中断请求,wait(2000)返回true,且打印“线程正常结束”;
    • 线程2被terminate()后,isRunning()为false,isFinished()为true;
    • 程序无崩溃、无死锁,正常退出。

关键说明

  • 安全终止:通过requestInterruption()设置标志位,线程在循环中检查并自行退出,这是推荐方式。
  • 强制终止:terminate()是危险操作,可能造成资源泄漏或死锁,仅用于无法响应中断的紧急场景。本示例仅用于演示其效果。
  • 状态观察:通过信号stateChanged实时反馈线程生命周期变化,这是Qt线程通信的推荐模式。
Qt线程生命周期状态机 Idle(未启动) Running(运行中) Finishing(正常结束) Terminated(强制终止) start() run() 正常返回 terminate() wait() 回收资源后回到 Idle 绿色:正常路径 | 红色:危险路径 | 蓝色:资源回收