1. 创建第一个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
运行方式
- 将上述四个文件(
mythread.h、mythread.cpp、main.cpp、mythread.pro)放在同一目录下。 - 在终端中执行以下命令:
qmake mythread.pro
make
./first_thread
验证方法
程序运行后,观察终端输出。预期输出应包含以下信息:
主线程ID: 0x7f8a4a0b7780
子线程消息: 线程已启动
子线程ID: 0x7f8a49d8b640
子线程消息: 线程执行完毕
主线程消息: 子线程已结束
判定通过条件:
- 主线程 ID 与子线程 ID 不同(十六进制数值不同),证明
run()确实在独立线程中执行。 - 输出顺序为先打印主线程 ID,再打印子线程消息,最后打印主线程结束消息,说明
wait()正确阻塞了主线程直到子线程完成。
说明:线程 ID 的具体数值因操作系统和运行环境而异,但主线程与子线程的 ID 必然不同。若输出中两个 ID 相同,则说明线程未正确创建,需要检查代码逻辑。