1. 创建第一个Qt线程

创建第一个Qt线程 学习卡片

任务目标

使用 QThread 创建并启动一个简单线程,在 run() 中打印线程 ID 和消息,验证线程确实在独立线程中执行。

环境依赖

  • Qt 5.15+ 或 Qt 6.x(本案例使用 Qt 6 语法,Qt 5 同样兼容)
  • 编译器:支持 C++11 或更高版本
  • 构建工具:qmake 或 CMake(本案例提供 .pro 文件)

完整实现

创建一个继承自 QThread 的自定义线程类,重写 run() 函数。在 run() 中通过 QThread::currentThreadId() 获取当前线程 ID,并与主线程 ID 对比,以验证线程确实在独立线程中运行。

// mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QDebug>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);

protected:
    void run() override;
};

#endif // MYTHREAD_H

// mythread.cpp
#include "mythread.h"

MyThread::MyThread(QObject *parent)
    : QThread(parent)
{
}

void MyThread::run()
{
    // 获取当前线程ID(即子线程ID)
    Qt::HANDLE threadId = QThread::currentThreadId();
    qDebug() << "子线程消息: 线程已启动";
    qDebug() << "子线程ID: " << threadId;
    qDebug() << "子线程消息: 线程执行完毕";
}

// main.cpp
#include <QCoreApplication>
#include <QDebug>
#include "mythread.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 获取主线程ID
    Qt::HANDLE mainThreadId = QThread::currentThreadId();
    qDebug() << "主线程ID: " << mainThreadId;

    // 创建并启动子线程
    MyThread thread;
    thread.start();

    // 等待线程执行完成
    thread.wait();

    qDebug() << "主线程消息: 子线程已结束";

    return a.exec();
}

// mythread.pro
QT += core
QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

TARGET = first_thread
TEMPLATE = app

SOURCES += main.cpp \
           mythread.cpp

HEADERS += mythread.h

运行方式

  1. 将上述四个文件(mythread.h、mythread.cpp、main.cpp、mythread.pro)放在同一目录下。
  2. 在终端中执行以下命令:
qmake mythread.pro
make
./first_thread

验证方法

程序运行后,观察终端输出。预期输出应包含以下信息:

主线程ID:  0x7f8a4a0b7780
子线程消息: 线程已启动
子线程ID:  0x7f8a49d8b640
子线程消息: 线程执行完毕
主线程消息: 子线程已结束

判定通过条件:

  • 主线程 ID 与子线程 ID 不同(十六进制数值不同),证明 run() 确实在独立线程中执行。
  • 输出顺序为先打印主线程 ID,再打印子线程消息,最后打印主线程结束消息,说明 wait() 正确阻塞了主线程直到子线程完成。
说明:线程 ID 的具体数值因操作系统和运行环境而异,但主线程与子线程的 ID 必然不同。若输出中两个 ID 相同,则说明线程未正确创建,需要检查代码逻辑。