首页 > 其他分享 >Qt线程简单使用二:QObject~创建任务类

Qt线程简单使用二:QObject~创建任务类

时间:2023-05-29 23:55:37浏览次数:38  
标签:num Qt work QObject MyWork 线程 QThread

  需求:   点击QPushButton按钮,QLabel中的数字,不断累加,一直到999。   做法:   点击QPushButton后,启动线程,线程while循环,不断发送累加的数字会主线程,修改QLabel中的数字   其他:   一个任务类,可以创建多个任务,写法麻烦一点,视情况决定是否采用这种方法。     主要代码:

// MyThread.h

#pragma once

#include <QObject>
#include <QThread>

class MyWork  : public QObject
{
    Q_OBJECT

public:
    MyWork(QObject *parent=nullptr);
    ~MyWork();
    
    void work();

signals:
    void sendNum(int num);
};

 

// MyThread.cpp

#include "MyThread.h"

MyWork::MyWork(QObject *parent)
    : QObject(parent)
{}

MyWork::~MyWork()
{}

void MyWork::work()
{
    int num = 0;
    while (num < 1000)
    {
        emit sendNum(num);
        num++;
        QThread::msleep(5);
    }
}

 

 

// QtWidgetsApplication1.cpp


#include "MyThread.h"


MyWidget::MyWidget(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);

    // 1.创建子线程对象
    QThread* t = new QThread;

    // 2.创建任务类对象
    MyWork* work = new MyWork;

    // 3.将任务类对象移动到子线程对象中
    work->moveToThread(t);

    // 开始工作
    connect(this, &MyWidget::startWork, work, &MyWork::work);
    connect(work, &MyWork::sendNum, this, [=](int num) {ui.label->setText(QString::number(num)); });
    connect(ui.pushButton, &QPushButton::clicked, this, [=]() 
        {
            emit startWork();
            t->start();
        });

    // 释放
    // 第一种:创建的时候,添加this参数,这样会自动析构,例:QThread* t = new QThread(this);
    // 第二种,手动释放
    connect(this, &MyWidget::destroy, [=]() {
        t->quit();
        t->wait();
        delete t;

        delete work;
        });
    
}

 

             

标签:num,Qt,work,QObject,MyWork,线程,QThread
From: https://www.cnblogs.com/shiyixirui/p/17442054.html

相关文章

  • 线程池
    线程池1、线程池的7个参数corePoolSize,核心线程数,当新的任务到来时,如果当前核心线程的数量没有>设置的值就新建一个线程执行该任务;否则,就将新任务放入工作队列/等待队列中maximumPoolSize,线程池的最大线程数,当新任务到来时,如果当前线程数量>=maximumPoolSize,执行拒绝......
  • 基于QT的空闲教室预约系统[2023-05-29]
    基于QT的空闲教室预约系统[2023-05-29][课程设计选题十]空闲教室预约系统课程设计内容利用QtCreater等工具和Linux环境下时间日期API实现一个基于图形界面的空闲教室预约系统,自行构建界面,可以实现选择日期、教学楼、教室座位数,查询相应空闲教室情况,录用申请信息,教室管理员......
  • C# 多线程
    什么是线程Thread线程是一个可执行路径,它可以独立于其它线程执行。每个线程都在操作系统的进程(Process)内执行,而操作系统进程提供了程序运行的独立环境。单线程应用,在进程的独立环境里只跑一个线程,所以该线程拥有独占权多线程应用,单个进程中会跑多个线程,它们会共享当前的执行......
  • Qt拖拽功能
    Qt拖拽功能窗口拖拽文件读取文件路径+文件名voidMainWindow::dragEnterEvent(QDragEnterEvent*ev){if(ev->mimeData()->hasUrls()){ev->accept();//接收拖动进入事件}//ev->ignore();//若忽略该事件,则不会发生之后的事件,拖放到此结束}voidM......
  • Qt实现两个窗口之间信号发送与接收
    主要使用了信号与槽的相关实现方法目录1、实现过程2、运行效果1、实现过程1、新建一个Widget,然后再建一个QMainWindow。2、在mainwindow.h头文件中自定义信号,声明的时候要用signals关键字,在public、private和protect等限定符,因为信号默认是public函数。3、在mianwindow.ui中添......
  • Qt键盘事件和鼠标事件的简单案例实现
    事件:事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的统称。Qt中使用一个对象来表示一个事件,继承自QEvent类。注意:事件与信号并不相同,事件与信号是两个不同层面的东西,发出者不同,作用也不同。案例要实现的功能:通过设置键盘的快捷键来切换另一个窗口通过......
  • 进程和线程
    什么是进程?启动一个应用程序,开始运行代码,计算机就要给他分配各种资源,这样就拉起了一个进程,例如:启动jmeter,是启动了一个进程,进程下可以有多个线程,CPU分配时间片,先分给进程,再分给进程下的线程;进程和线程的关系:做个简单的比喻:进程=火车,线程=车厢1、线程在进程下行进(单纯的车......
  • java线程池
    1.JDK中的Executor框架是基于生产者-消费者模式的线程池,提交任务的线程是生产者,执行任务的线程是消费者。Executor线程池可以用于异步任务执行,而且支持很多不同类型任务执行策略,同时为任务提交和任务执行之间的解耦提供了标准方法。Executor线程池支持如下三种线程执行策略:(1).顺序......
  • ABAP 多线程
    Codelistingfor:ZTEST9010Description:12345*&---------------------------------------------------------------------**&ReportZTEST_ASYNC_RFC*&---------------------------------------------------------------------**&*&-----------......
  • MQTT协议简介
    ##一、MQTT协议简介MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。![img.png](img.png)MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提......