首页 > 其他分享 >QT 多线程

QT 多线程

时间:2024-03-11 14:55:40浏览次数:32  
标签:Widget QT void public MyThread 多线程 create QThread

 

第一种:静态函数

 1 void print()
 2 {
 3     for(int i = 0;i<5;i++)
 4         qInfo()<<"hello global print";
 5 }
 6 class MainWindow:public QWidget
 7 {
 8     Q_OBJECT
 9 public:
10     MainWindow(QWidget*parent = nullptr):QWidget(parent)
11     {
12         qInfo()<<"end";
13     }
14     static void print1()
15     {
16         for(int i = 0;i<5;i++)
17             qInfo()<<"hello static print1";
18     }
19     void print2()
20     {
21         for(int i = 0;i<5;i++)
22             qInfo()<<"hello print2";
23     }
24 };
create函数说明
 1 //QThread::create使用全局函数作为入口函数。
 2 auto* thr = QThread::create(print);
 3 thr->start();
 4 
 5 //QThread::create使用类的静态函数作为入口函数。
 6 auto* thr1 = QThread::create(&MainWindow::print1);
 7 thr1->start();
 8 
 9 //QThread::create使用类的非静态函数作为入口函数。
10 auto* thr2 = QThread::create(&MainWindow::print2,&w);
11 thr2->start();
12 
13 //QThread::create使用Lambda表达式作为入口函数。
14 auto* thr3 = QThread::create([](){qInfo()<<"hello lambda";});
15 thr3->start();

给入口函数传参

 1 void print(const QString& str)
 2 {
 3     for(int i = 0;i<5;i++)
 4     {
 5         qInfo()<<"hello global print"<<str;
 6     }
 7 }
 8 ​
 9 auto* thr = QThread::create(print,"I Like Qt");
10 thr->start();

第二种:继承QThread

头文件:MyThread.h

 1 #include <QThread>
 2 class MyThread : public QThread
 3 {
 4     Q_OBJECT
 5 public:
 6     explicit MyThread(QObject *parent = nullptr);
 7     ~MyThread();
 8 protected:
 9     void run() override;
10 signals:
11 
12 };

源文件:MyThread.cpp

 1 #include "mythread.h"
 2 #include<QDebug>
 3 MyThread::MyThread(QObject *parent)
 4     : QThread(parent)
 5 {}
 6 MyThread::~MyThread()
 7 {
 8     qDebug()<<   "MyThread::~MyThread()";
 9 }
10 
11 void MyThread::run()
12 {
13     int i= 0;
14     while(i<200)
15     {
16         QThread::msleep(20);
17         if(i==150)
18             break;
19         qDebug()<<"i"<<i++;
20     }
21 }

源文件:Widget.cpp

 1 #include "widget.h"
 2 #include<QDebug>
 3 #include<QThread>
 4 
 5 Widget::Widget(QWidget *parent)
 6     : QWidget(parent)
 7     , ui(new Ui::Widget)
 8 {
 9     ui->setupUi(this);
10     thr = new MyThread(this);
11     connect(thr,&QThread::started,this,[](){qDebug()<<"start";});
12     connect(thr,&QThread::finished,this,[](){qDebug()<<"finished";});
13     thr->start();
14 }
15 
16 Widget::~Widget()
17 {
18     thr->quit();
19     delete thr;
20 
21     delete ui;
22 }

 

第三种:移动到线程

 

 1 class Worker : public QObject
 2   {
 3       Q_OBJECT
 4   public slots:
 5       void doWork(const QString &parameter) {
 6           QString result;
 7           /* ... here is the expensive or blocking operation ... */
 8           emit resultReady(result);
 9       }
10 
11   signals:
12       void resultReady(const QString &result);
13   };
14 
15   class Controller : public QObject
16   {
17       Q_OBJECT
18       QThread workerThread;
19   public:
20       Controller() {
21           Worker *worker = new Worker;
22           worker->moveToThread(&workerThread);
23           connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
24           connect(this, &Controller::operate, worker, &Worker::doWork);
25           connect(worker, &Worker::resultReady, this, &Controller::handleResults);
26           workerThread.start();
27       }
28       ~Controller() {
29           workerThread.quit();
30           workerThread.wait();
31       }
32   public slots:
33       void handleResults(const QString &);
34   signals:
35       void operate(const QString &);
36   };

 

标签:Widget,QT,void,public,MyThread,多线程,create,QThread
From: https://www.cnblogs.com/wuyuan2011woaini/p/18066037

相关文章

  • QT信号与槽机制与事件机制的区别
    QT信号与槽机制与事件机制的区别第一:什么是信号与槽?事件?所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一......
  • 深入浅出Java多线程(十):CAS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十篇内容:CAS。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程中,对共享资源的安全访问和同步控制是至关重要的。传统的锁机制,如synchronized关键字和ReentrantLock等,能够有效防止多个线程......
  • 多线程系列(十六) -常用并发原子类详解
    一、简介在Java的java.util.concurrent包中,除了提供底层锁、并发同步等工具类以外,还提供了一组原子操作类,大多以Atomic开头,他们位于java.util.concurrent.atomic包下。所谓原子类操作,顾名思义,就是这个操作要么全部执行成功,要么全部执行失败,是保证并发编程安全的重要一环。相......
  • Linux多线程-线程同步
    线程同步当多个线程同时对一个共享数据进行操作时,会导致数据竞争,下面例子展示了数据竞争的情况:1#include<pthread.h>2#include<stdio.h>3#include<stdlib.h>4#include<string.h>5#include<unistd.h>67staticintval=0;8void*threadEntry(void*......
  • Linux多线程
    线程的概念线程是指程序中的一条执行路径。在一个进程中,至少有一个线程,称为主线程,通过主线程可以派生出其他子线程。Linux系统内核只提供了轻量级进程(light-weight process)的支持,并未实现线程模型。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。进程是......
  • 分布式锁——JVM锁、MySQL锁解决多线程下并发争抢资源
    分布式锁——JVM锁、MySQL锁解决库存超卖问题引入库存扣案例需求背景电商项目中,用户购买商品后,会对商品的库存进行扣减。需求实现根据用户购买商品及商品数量,对商品的库存进行指定数量的扣减publicStringdeductStock(LonggoodsId,Integercount){//1.查询商品......
  • 多进程、多线程知识再整理
    #threading模块'''cpython全局解释器锁导致同时只能有一个线程执行python,利用多cpu执行cpu密集型任务使用多进程,密集io型可以使用多线程并发classthreading.Thread(group=None,target=None,name=None,args=(),kwargs={},*,daemon=NoneThread类代表一个在独立控制线......
  • 手撕Java多线程(四)线程之间的协作
    线程之间的协作当多个线程可以一起去解决某个问题时,如果某些部分必须在其他部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的join()方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然b线程先启动,但是因为在b线程中调用了a线程的join......
  • IDEA使用与多线程
    IDEA缩写和快捷键psvm全称publicstaticvoidmainsout全称publicstaticvoidmainalt+enter处理异常s.out自动打印sctrl+art+t给整段代码加框如try-catch一、概念进程、程序和进程程序(program)是为完成任务、用某种语言编写的一组指令的集合。即指一段静态的代码,......
  • 使用AT+MQTT指令连接华为云实现数据上传
    1准备工作硬件设备模块:ESP-01-S固件烧录工具:ESP8266下载器串口调试工具:VOFA+参考文章:stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与下发的命令处理2固件更新2.1为什么要重新安装固件由于ESP-01-S模块出厂没有集成MQTT指令,故需要自己下载固件包,详见官网固......