计算机系统应用教程网站

网站首页 > 技术文章 正文

QThread类的第一种用法——worker-object工作者对象

btikc 2024-10-24 09:31:47 技术文章 7 ℃ 0 评论

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 的基本流程。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表