首页 > 其他分享 >Qt线程使用方法一:moveToThread

Qt线程使用方法一:moveToThread

时间:2024-05-23 21:51:29浏览次数:20  
标签:moveToThread Qt Worker QObject 任务 线程 include

在Qt中创建线程去执行耗时任务,并在任务完成后通知调用方(无论成功还是失败),可以通过使用QThread和信号槽机制来实现。

以下是一个简单的示例,展示如何创建一个线程来执行任务,并在任务完成后发送信号。

步骤 1: 定义工作类

首先,定义一个工作类,该类将在单独的线程中执行任务。这个类需要继承自QObject,以便使用Qt的信号槽机制。

#include <QObject>
#include <QDebug>

class Worker : public QObject {
    Q_OBJECT

public:
    Worker() {}

signals:
    void resultReady(const QString &result);
    void failed(const QString &error);

public slots:
    void doWork() {
        try {
            // 模拟耗时任务
            qDebug() << "Task started.";
            QThread::sleep(3);  // 假设任务需要3秒钟
            qDebug() << "Task finished.";

            // 任务成功完成
            emit resultReady("Task completed successfully.");
        } catch (const std::exception &e) {
            // 任务失败
            emit failed(e.what());
        }
    }
};

 

步骤 2: 在主类中使用工作类

在主类中,创建Worker对象和QThread对象,并将Worker移动到新线程中。连接相应的信号和槽,以便在任务完成或失败时接收通知。 

#include <QCoreApplication>
#include <QThread>
#include "Worker.h"

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

    QThread workerThread;
    Worker worker;

    // 将Worker对象移动到新线程
    worker.moveToThread(&workerThread);

    // 连接信号和槽
    QObject::connect(&workerThread, &QThread::finished, &worker, &QObject::deleteLater);
    QObject::connect(&worker, &Worker::resultReady, [](const QString &result) {
        qDebug() << "Received result: " << result;
    });
    QObject::connect(&worker, &Worker::failed, [](const QString &error) {
        qDebug() << "Task failed: " << error;
    });

    // 启动线程
    workerThread.start();

    // 开始执行任务
    QMetaObject::invokeMethod(&worker, "doWork");

    // 等待线程完成
    workerThread.quit();
    workerThread.wait();

    return a.exec();
}

 

注意事项

1. 线程安全:确保你的工作类中的方法是线程安全的。 

2. 资源管理:确保线程正确地启动和结束,避免资源泄漏。 

3. 信号和槽:使用信号和槽来进行线程间的通信,避免直接操作GUI或其他非线程安全的对象。 

通过这种方式,你可以在Qt中有效地管理线程,执行耗时任务,并在任务完成后通知调用方。

标签:moveToThread,Qt,Worker,QObject,任务,线程,include
From: https://www.cnblogs.com/onlyou13/p/18209438

相关文章

  • Python多线程案例分析
    接下来,我们将在之前的基础上进一步扩展多线程爬虫案例,增加以下功能:1.动态URL发现与添加:爬虫在解析页面时,能够发现并添加新的URL到队列中。2.设置请求头:模拟浏览器行为,设置请求头中的`User-Agent`。3.使用会话:使用`requests.Session()`对象来保持连接,提高效率。4.避免重......
  • 关于QT的头文件相互包含的问题
    就是我有两个代码,head_test.cpp,head_test.h和head_test2.cpp,head_test2.h。要互相调用对方的类。为了方便看下面我就用A代表head_test,B代表head_test21.head_test.h2.head_test.cpp3.head_test2.h4.head_test2.cpp这两天我在查网上的资料,基本上都是说,需要在头文件中......
  • 守护线程
    Python中的主线程是程序的起始线程,即程序启动时自动创建的第一个线程,它执行程序的主体逻辑。守护线程则是在后台运行并依赖于主线程或非守护线程的存在。【一】主线程死亡,子线程未死亡主线程结束运行后不会马上结束,而是等待其他非守护子线程结束之后才会结束如果主线程死亡就......
  • 线程互斥锁
    所有子线程都会进行阻塞操作,导致最后的改变只是改了一次fromthreadingimportThreadimporttimemoney=100deftask():globalmoney#模拟获取到车票信息temp=money#模拟网络延迟time.sleep(2)#模拟购票money=temp-1defmain():task_list=[Thread(ta......
  • 线程模块
    概述该模块基于pthread实现。sylar说,由于c++11中的thread也是由pthread封装实现的,并且没有提供读写互斥量,读写锁,自旋锁等,所以自己封装了pthread。包括以下类:Thread:线程类,构造函数传入线程入口函数和线程名称,线程入口函数类型为void(),如果带参数,则需要用std::bind进行绑定。线......
  • QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
     Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台。在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他的IDE配合CMake等方式,但使用QtCreator更加方便,并且操作环境完全一致。QtCreator支持Windows、Linux、M......
  • 浅谈一下C#和java的线程不同点
    C#和Java在线程处理方面有一些显著的区别,这些区别主要体现在线程的创建、管理和生命周期控制上。以下是一些主要的区别:线程的创建和管理Java:Java中线程的创建通常是通过继承Thread类或实现Runnable接口来实现的。Java提供了线程组(ThreadGroup)的概念,允许将线程组织在一起......
  • uniapp中使用mqtt.js的踩坑记录
    最近在uniapp的vue3.0版本中使用mqtt.js库时遇到了一些坑,经过亲身踩坑,现在把实际能够实现在uniapp的app端能够使用mqtt.js的方法步骤记录如下:一、安装首先安装mqtt.js,建议使用较为稳定的3.0.0版本:[email protected]二、引入mqtt.jsimportmqttfrom'mqtt/dist/mqtt.......
  • QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境De
    前言  使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车、无人船、无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇:上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。下半部分:在上半......
  • 【老鼠看不懂的数据结构】FHQTreap 初识
    Treap弱平衡的随机性很强的老鼠看不懂的平衡树Q:为什么叫Treap?A:看看二叉搜索树(BST)和堆(Heap),组合起来就是Treap其中,二叉搜索树的性质是:左子节点的值(val)比父节点小右子节点的值(val)比父节点大如果这些节点的值都一样,这棵树就会退化成一颗(?)链。对,我知道你在想......