首页 > 其他分享 >Qt线程使用方法二:派生QThread

Qt线程使用方法二:派生QThread

时间:2024-05-23 21:56:24浏览次数:30  
标签:task Qt void TaskThread 线程 include QThread

在Qt中,从QThread派生一个子类并在构造函数中传入需要执行的方法,然后在线程中运行该方法并通知执行结果,

是一种常见的多线程处理模式。以下是如何实现这一功能的步骤和示例代码: 

步骤 1: 定义线程类

 首先,定义一个从QThread派生的线程类。在这个类中,你可以定义一个函数指针或者使用std::function来存储传入的方法。 使用信号来通知任务的完成或失败。  
#include <QThread>
#include <functional>
#include <QDebug>

class TaskThread : public QThread {
    Q_OBJECT

public:
    using TaskFunction = std::function<void()>;

    TaskThread(TaskFunction task, QObject *parent = nullptr)
        : QThread(parent), task_(task) {}

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

protected:
    void run() override {
        try {
            if (task_) {
                task_();  // 执行传入的任务
                emit resultReady("Task completed successfully.");
            }
        } catch (const std::exception &e) {
            emit failed(e.what());
        }
    }

private:
    TaskFunction task_;
};

 

步骤 2: 使用线程类

 在主函数或其他适当的位置创建TaskThread的实例,传入需要执行的任务。连接信号到适当的槽以处理任务完成和失败的通知。
#include <QCoreApplication>
#include "TaskThread.h"

void myTask() {
    qDebug() << "Running task...";
    QThread::sleep(2);  // 模拟耗时操作
    qDebug() << "Task completed.";
}

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

    TaskThread *thread = new TaskThread(myTask);
    QObject::connect(thread, &TaskThread::resultReady, [](const QString &result) {
        qDebug() << result;
    });
    QObject::connect(thread, &TaskThread::failed, [](const QString &error) {
        qDebug() << "Error: " << error;
    });
    QObject::connect(thread, &TaskThread::finished, thread, &QObject::deleteLater);

    thread->start();

    return app.exec();
}

 

注意事项 

1. 线程安全:确保传入TaskThread的任务是线程安全的。 

2. 资源管理:使用QObject::deleteLater确保线程对象在完成后被正确删除。 

3. 错误处理:在run方法中使用try-catch块来捕获并处理任务中可能抛出的异常。 

通过这种方式,你可以灵活地在Qt中使用线程来执行任何指定的任务,并在任务完成时通过信号通知调用方。这种模式使得线程的使用更加灵活和安全。

标签:task,Qt,void,TaskThread,线程,include,QThread
From: https://www.cnblogs.com/onlyou13/p/18209446

相关文章

  • Qt线程使用方法一:moveToThread
    在Qt中创建线程去执行耗时任务,并在任务完成后通知调用方(无论成功还是失败),可以通过使用QThread和信号槽机制来实现。以下是一个简单的示例,展示如何创建一个线程来执行任务,并在任务完成后发送信号。步骤 1: 定义工作类首先,定义一个工作类,该类将在单独的线程中执行任务。这个类......
  • 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的空工程。下半部分:在上半......