当前位置: 首页 > article >正文

qt 类中的run线程

在Qt中,QThread类的run()方法是线程的执行入口,它是由QThread内部自动调用的,而不是用户直接调用。

详细解释:
QThread类:

QThread是Qt的线程类,提供了用于多线程操作的接口。我们可以创建QThread对象并将任务放入其中执行。线程的实际执行是通过继承QThread类并重写run()方法,或者使用moveToThread()将一个QObject对象的槽移至子线程中来实现的。
run()方法:

QThread的run()方法是一个虚函数,当你启动线程时,run()方法会被自动调用。通常情况下,我们不会直接调用run()方法,而是使用start()方法来启动线程。调用start()方法后,QThread会在新线程中自动调用run()。
使用QThread的两种方式:
通过继承QThread并重写run()方法:

这种方式比较简单,但也有一些限制,比如在run()方法中不建议进行Qt的UI操作,因为Qt的UI只能在主线程中操作。

class WorkerThread : public QThread
{
public:
    void run() override {
        // 线程要执行的工作
        for (int i = 0; i < 5; ++i) {
            qDebug() << "Running in thread";
            QThread::sleep(1);
        }
    }
};

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

    WorkerThread thread;
    thread.start(); // 启动线程,调用run()

    thread.wait(); // 等待线程结束
    return app.exec();
}

在这个例子中:

你可以看到,run()方法会在调用start()时被自动调用。
start()方法会启动新线程,然后在新线程中自动执行run()方法。
通过moveToThread()将QObject对象移至工作线程:

这是更常用的做法,因为它允许你将现有的QObject对象放入工作线程,而不需要直接继承QThread。

class Worker : public QObject
{
    Q_OBJECT
public slots:
    void doWork() {
        for (int i = 0; i < 5; ++i) {
            qDebug() << "Working in thread";
            QThread::sleep(1);
        }
    }
};

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

    QThread thread;
    Worker worker;
    
    worker.moveToThread(&thread); // 将worker对象移到线程中
    
    QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork); // 连接信号和槽
    QObject::connect(&worker, &Worker::finished, &thread, &QThread::quit); // 工作完成后退出线程
    QObject::connect(&worker, &Worker::finished, &worker, &QObject::deleteLater); // 工作完成后删除worker

    thread.start(); // 启动线程,调用worker的doWork()

    thread.wait(); // 等待线程结束
    return app.exec();
}

在这个例子中:

我们创建了一个Worker类,并将它移到QThread中运行。
当线程启动时,它会调用doWork()槽方法(而不是直接调用run())。
moveToThread()将worker对象移至QThread中执行任务,doWork()方法在新线程中运行。
总结:
QThread::run():这是QThread类的虚函数,当你调用start()方法时,run()方法会被自动调用,执行你在线程中需要完成的任务。你通常不会直接调用run()方法。

线程启动:

当你使用QThread时,线程通过调用start()方法启动。
线程内的工作是通过重写run()或使用moveToThread()和槽来完成的。
moveToThread():这是将QObject对象移到一个新的线程中,这样你可以在子线程中执行工作,而不需要继承QThread。


http://www.kler.cn/a/445411.html

相关文章:

  • 疾风大模型气象系统:精准预报,引领未来
  • 【Python】pandas库---数据分析
  • LabVIEW与PLC点位控制及OPC通讯
  • WebPlotDigitizer 使用指南
  • 黑马Java面试教程_P1_导学与准备篇
  • 图像生成工具WebUI
  • 【漏洞复现】CVE-2022-45206 CVE-2023-38905 SQL Injection
  • Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
  • ajax同步执行async:false无效的解决方法
  • Nmea0813协议 C语言解析Demo
  • 网上卖课割韭菜
  • 基于Python的天文图像处理系统
  • hdparm 功能解析
  • 微软的 GraphRAG + AutoGen + Ollama + Chainlit = 本地和免费的多代理 RAG 超级机器人
  • 14篇--模板匹配
  • C# 表达式树
  • C++ 11(1)
  • FPGA 基础了解
  • js日期时区问题
  • 初学stm32 --- PWM输出
  • 网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案
  • 鸿蒙项目云捐助第十一讲鸿蒙App应用的捐助成功自定义对话框组件实现
  • ubuntu 24.04-无域名创建本机和局域网和同网段局域网机器可访问的https网页服务
  • JAVA:组合模式(Composite Pattern)的技术指南
  • Nginx负载均衡(upstream)
  • SM2 算法介绍