首页 > 其他分享 >qt 线程

qt 线程

时间:2023-08-17 10:45:42浏览次数:37  
标签:qt int void Worker QObject Controller 线程 include

qt线程创建有两种方式:

1、信号槽形式

2、继承QThread形式。

这里记一下信号槽形式。参考:https://blog.csdn.net/douzhq/article/details/104156580

worker.h

 1 #ifndef WORKER_H
 2 #define WORKER_H
 3 
 4 #include <QObject>
 5 class Worker : public QObject
 6 {
 7     Q_OBJECT
 8 
 9 public:
10     Worker(QObject* parent = nullptr);
11     ~Worker();
12 
13 public slots:
14     // 计算前count个数的和
15     void doWork(int count);
16 
17 signals:
18     // 发送计算完成信号
19     void doFinished(int);
20 };
21 
22 #endif

worker.cpp

 1 #include "Worker.h"
 2 #include <QDebug>
 3 #include <QThread>
 4 
 5 Worker::Worker(QObject* parent)
 6     :QObject(parent)
 7 {
 8 
 9 }
10 
11 Worker::~Worker()
12 {
13 
14 }
15 
16 // 计算 0~count个数的和
17 void Worker::doWork(int count)
18 {
19     int sum = 0;
20     for (int i=0; i<=count; ++i)
21         sum += i;
22 
23     // 打印当前函数名,线程ID,以及计算结果
24     qDebug() << __FUNCTION__ << "Thread ID: " << QThread::currentThreadId() << ", Result is " << sum;
25 
26     emit doFinished(sum);
27 }

controller.h

 1 #ifndef MYOBJECT_H
 2 #define MYOBJECT_H
 3 
 4 #include <QObject>
 5 #include <QThread>
 6 
 7 class Controller : public QObject
 8 {
 9     Q_OBJECT
10 
11 public:
12     Controller(QObject* parent = nullptr);
13     ~Controller();
14 
15     // 开启线程计算
16     void startThreadRunFunc(int number);
17 
18 private:
19     QThread m_thread;
20 
21 signals:
22     // 该信号用于触发工作者中的槽函数
23     void startCalcSum(int);
24 
25 private slots:
26     // 接受计算完毕后的结果槽函数
27     void onCalcSumFinished(int sum);
28 };
29 
30 #endif

controller.cpp

 1 #include "Controller.h"
 2 #include "Worker.h"
 3 #include <QDebug>
 4 
 5 Controller::Controller(QObject* parent)
 6     :QObject (parent)
 7 {
 8     // [1]
 9     Worker* worker = new Worker;
10     worker->moveToThread(&m_thread);
11 
12     // [2]
13     QObject::connect(this, &Controller::startCalcSum, worker, &Worker::doWork);
14     // [3]
15     QObject::connect(worker, &Worker::doFinished, this, &Controller::onCalcSumFinished);
16 
17     // [4] 当线程退出时,释放工作者内存
18     QObject::connect(&m_thread, &QThread::finished, worker, &Worker::deleteLater);
19 
20     // [5]
21     m_thread.start();
22 }
23 
24 Controller::~Controller()
25 {
26     m_thread.quit();
27     m_thread.wait();
28 }
29 
30 void Controller::startThreadRunFunc(int number)
31 {
32     // 发送开始计算信号
33     emit startCalcSum(number);
34     qDebug() << __FUNCTION__ << " : Current Thread is " << QThread::currentThreadId();
35 }
36 
37 void Controller::onCalcSumFinished(int sum)
38 {
39     // 打印行数名,当前线程ID,计算结果
40     qDebug() << __FUNCTION__ \
41              << " : Current Thread is " << QThread::currentThreadId() \
42              << ", Result is " << sum;
43 }

调用方法:

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

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

    // 创建控制器
    Controller *object = new Controller;
    // 计算前100个数的和
    object->startThreadRunFunc(100);

    return a.exec();
}

执行结果如下:
Controller::startThreadRunFunc : Current Thread is 0x491c
Worker::doWork Thread ID: 0x62c0 , Result is 5050
Controller::onCalcSumFinished : Current Thread is 0x491c , Result is 5050

整体流程如下:

函数 startThreadRunFunc 发送信号 startCalcSum ,此过程在主线程中执行。
触发 doWork 槽函数,计算前100个数的和,并发送信号 doFinished 信号,此过程在新建的线程中执行。
触发 onCalcSumFinished 槽函数,此过程在主线程中执行。

 

标签:qt,int,void,Worker,QObject,Controller,线程,include
From: https://www.cnblogs.com/warmlight/p/17636926.html

相关文章

  • jmeter详解-线程组详解(1)-Thread Group
    Jmeterplugin插件的分类StandardSet组件:对线程组进行了扩展,扩充了许多丰富图表的监听器,可以用Jmeter来监控服务器ExtrasSet组件:支持远程监控,图表展示更加丰富ExtraswithLibsSet组件:提供对JSON的支持,新增了JMS取样器WebDriverSet组件:与WebDriver进行了集成,进行自动化测......
  • c++的线程初探-2
    (目录)一、条件变量条件变量是一种线程同步机制。当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。C++11的条件变量提供了两个类:condition_variable:只支持与普通mutex搭配,效率更高。condition_variable_any:是一种通用的条件变量,可以与任意mutex搭配(包......
  • Qt for ARM_Linux环境搭建-Qt5.7+iTop4412嵌入式平台移植
    原文:https://blog.csdn.net/hechao3225/article/details/52981148经过为期3天的编译、移植,终于将Qt5.7成功移植到iTop4412开发板,板载exynos4412处理器,基于ARMCortex-A9内核。因此,本篇教程以iTop4412示例,适用于Qt5.7在ARM_Linux平台上的移植。---------------------------------......
  • 【转载】JUC常见面试题:Java线程和操作系统线程有什么区别
    【转载】JUC常见面试题:Java线程和操作系统线程有什么区别整理来自于:https://cloud.tencent.com/developer/article/18181511操作系统的用户态和核心态在操作系统中,内存通常会被分成用户空间(Userspace)与内核空间(Kernelspace)这两个部分。当进程/线程运行在用户空间时就处于用......
  • 网络编程day04--线程管理
    线程管理基本概念1、线程是进程的执行路线,它是进程内部的控制序列,线程是进程的一部分,进程是一个资源单位,而线程是执行单位,线程是进程执行的实体,负责真正的执行2、线程是轻量级的,没有自己的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前工......
  • Qt+rtsp+ffmpeg 播放声音
    #include<QtCore/QCoreApplication>#include<QtMultimedia/QAudioFormat>#include<QtMultimedia/QAudioOutput>#include<QtCore/QFile>#include<iostream>#ifdef__cplusplusextern"C"{#endif//__cplusplus#include"li......
  • (随笔)龟兔赛跑(多线程调用同一资源时一个线程结束时其他线程保持运行)
    问题:当其一线程结束运行后其他线程保持运行而非结束现象:控制台会输出两次thewinneris:xxx代码如下packagecom.demo01;/***TODO模拟归途赛跑**@authorpangyangjian*@since2023/8/1616:10*/publicclassTextThread_5implementsRunnable{ @Override......
  • 基于pyqt5的简易目标检测UI
    没选图像的时候:被否决的一个系统,也不过多介绍了,留个记录吧,之后可以看看优化一下,也不白写代码。代码:fromultralyticsimportYOLOfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialog,QLabel,QPushButton,QHBoxLayout,QVBoxLayout,QWidgetfromPyQt5.......
  • 多线程&异步编程
    多线程&网络编程(异步编程)1)重要性,高并发,短时间内遇到大量请求2)难度硬件.操作系统多线程本身的复杂性,死锁,资源抢占,线程同步...--->多线程进程:一般指程序中运行的程序,实际作用是为程序在执行过程中创建好所需要的环境和资源.线程:是进程的一个实体,是Cpu用来调度......
  • 多线程|线程的特性
      ......