网站首页 > 技术文章 正文
QThread 类在 Qt 库中用于创建和管理线程。其有两种用法,今天我们先讲QThread类的第一种用法worker-object工作者对象,也是QT官方推荐的,此种方法支持任何类或线程支持调用worker对象中的slots函数。另一种用法比较直接后面说明。
下面是一些基本的概念和步骤,帮助理解如何使用 QThread:
1. 创建线程
首先,你需要创建一个 QThread 对象。这个对象代表了一个独立的执行流。
QThread thread;
2. 创建工作者对象
接着,你需要创建一个继承自 QObject 的类作为“工作者”对象,这个对象包含了你希望在线程中执行的操作。
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {};
signals:
void resultReady(const QString &str);
public slots:
void doWork();
};
void Worker::doWork()
{
// 执行耗时任务
qDebug() << "Working in thread" << QThread::currentThreadId();
QString result="OK";
emit resultReady(result);
};
3. 将工作者对象移动到线程
此方法中 QThread 本身并不执行代码,你需要将工作者对象移动到 QThread 中,并且通过信号和槽机制来触发任务。
Worker worker;
worker.moveToThread(&thread); // 将工作者对象移动到新线程
4. 使用信号和槽进行通信
你可以连接 QThread 的 started() 信号到工作者对象的一个槽上,这样当线程启动时就会执行这个槽中的代码。且槽函数可发出信号跟启动线程进行通信。
connect(&workThread, &QThread::started, work, &Worker::doWork );
connect(&workThread, &QThread::finished, work, &QObject::deleteLater);
connect(work, &Worker::resultReady, this, &ThreadTest::handleResult);
5. 启动线程
最后,你可以启动线程,这将导致 started() 信号被发出,并进而调用 Worker 中的 doWork() 方法。
workThread.start();
6. 清理线程
确保在应用程序结束时或者不再需要线程时,安全地停止和清理线程非常重要。
workThread.quit();
workThread.exit();
完整示例
下面是上述步骤的一个完整示例:
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QObject *parent = nullptr) : QObject(parent) {};
signals:
void resultReady(const QString &str);
public slots:
void doWork();
};
class ThreadTest: public QObject
{
Q_OBJECT
public slots:
void handleResult(const QString &str);
public:
QThread workThread;
ThreadTest()
{
Worker *work = new Worker();
work->moveToThread(&workThread);
connect(&workThread, &QThread::started, work, &Worker::doWork );
connect(&workThread, &QThread::finished, work, &QObject::deleteLater);
connect(work, &Worker::resultReady, this, &ThreadTest::handleResult);
workThread.start();
}
~ThreadTest()
{
workThread.quit();
workThread.exit();
}
};
cpp文件
#include <QCoreApplication>
#include <QApplication>
#include <QThread>
#include <QDebug>
void Worker::doWork()
{
// 执行耗时任务
qDebug() << "Working in thread" << QThread::currentThreadId();
QString result="OK";
emit resultReady(result);
};
void ThreadTest::handleResult(const QString &str)
{
qDebug() << "get Result:" << str;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
ThreadTest threadTest;
return app.exec();
}
运行结果:
以上就是使用 QThread 的基本流程。
- 上一篇: Qt线程的生命周期 qt线程之间传递数据
- 下一篇: Qt5教程(九):Qt多线程 qt多线程例子
猜你喜欢
- 2024-10-24 QT(17)- QNetworkAccessManager qnetworkinterface.allinterfaces
- 2024-10-24 Qt多线程的三种方法QThread qt多线程直接处理数据
- 2024-10-24 从零开始学Qt(86):TCP服务器端程序设计
- 2024-10-24 Qt Core学习日记——第九天QObjectData
- 2024-10-24 Qt智能指针--QSharedPointer qt智能指针.get和.data函数后计数会加吗
- 2024-10-24 QT(11)- QThread qt ui thread work thread
- 2024-10-24 Qt QVariant的用法 qt基本语法
- 2024-10-24 Qt5中QOverload的用法 qt5coredll
- 2024-10-24 Qt多线程编程之QThread qt中的多线程
- 2024-10-24 Qt QModbusReply类 qty是什么单位的缩写
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)