QT 初识线程

举报
华为云 断点 发表于 2022/12/06 01:34:24 2022/12/06
【摘要】     QT多线程编程系列专栏文章共有12篇,全面的讲述、实现、运行了QT多线程的各种操作,包括运行原理、线程、进程、多线程、锁、QMutex、QSemaphore、 Emit、Sgnals、Slot、QWaitCondition、线程事件循环、QObjects、重入与线程安全、主线程子线程互相传值、线程同步与异步处理、线程的使用、浅拷贝、深拷贝、隐式共享、隐式共享机制对STL样式迭代器的影响等等

    QT多线程编程系列专栏文章共有12篇,全面的讲述、实现、运行了QT多线程的各种操作,包括运行原理、线程、进程、多线程、锁、QMutex、QSemaphore、 Emit、Sgnals、Slot、QWaitCondition、线程事件循环、QObjects、重入与线程安全、主线程子线程互相传值、线程同步与异步处理、线程的使用、浅拷贝、深拷贝、隐式共享、隐式共享机制对STL样式迭代器的影响等等文章。

    本文作者原创首发于CSDN,本文原创请勿转载

    版权声明:本文为CSDN博主「双子座断点」的原创文章,遵循CC 4.0 BY-SA版权协议。
    原文链接:https://blog.csdn.net/qq_37529913/article/details/110127940

本文详细的使用示例来简单的实现了线程的开启和关闭,首页推荐的文章千篇一律,深入灵魂的文章万里挑一。

接下来步入正题,开始代码实现

1、 新建项目QThread

正常建立项目

2、 新建线程类类

继承QThread,实现QObject。

3、 创建新线程

创建一个新的线程,重新实现QThread::run()。

有两种方法:一种是重新实现QThread::run()、另一种是方法类似只不过是通过判断bool值来开始结束线程。

本文使用第一种,因为简洁方便。

.h源文件

//引入
#include <QThread>
#include <QObject>
#include <QDebug>
 
//公共变量
    mythread();
    //线程处理函数
    void run();
 
signals:
    void isDone();  //处理完成信号

.cpp实现文件

void mythread::run()
{
    for(int i=0;i<10;i++) {
        qDebug() << "aa";
        sleep(1);
    }
    emit isDone();  //发送完成信号
}

4、 线程调用

.h源文件

//引入头文件
#include "mythread.h"
 
//槽函数
void dealDone();   //线程槽函数
 
private slots:
    //but按钮
    void on_pushButton_clicked();
 
    void on_pushButton_2_clicked();
private:
    Ui::MainWindow *ui;
    //初始化
    mythread * thread;

.cpp实现文件

//构造函数 
thread = new mythread;  //分配空间
//关联信号获取结束线程信号
connect(thread, &mythread::isDone, this, &MainWindow::dealDone);
//当按窗口右上角x时,触发destroyed信号 --一般关闭窗口所有线程都会自动销毁
connect(this, &MainWindow::destroyed, this, &MainWindow::dealDone);
void MainWindow::on_pushButton_clicked()
{
    //停止线程
   dealDone();
}
 
void MainWindow::on_pushButton_2_clicked()
{
 
    //启动线程,处理数据
    thread->start();
    ui->pushButton_2->setEnabled(false);
    ui->pushButton->setEnabled(true);
    for (int i=0;i<10;i++) {
        qDebug()<<"bb";
    }
 
}
 
void MainWindow::dealDone()
{
    ui->label->setText("it is over");
 
   //停止线程
   thread->quit();
 
   //等待线程处理完手头工作
   thread->wait();
   ui->pushButton_2->setEnabled(true);
   ui->pushButton->setEnabled(false);
 
}

5、 调用示例Demo

//取消sleep函数
void mythread::run()
{
    for(int i=0;i<10;i++) {
        qDebug() << "aa";
        //sleep(1);
    }
    emit isDone();  //发送完成信号
}

    void mythread::run()
    {
        for(int i=0;i<10;i++) {
            qDebug() << "aa";
            sleep(1);//1秒
        }
        emit isDone();  //发送完成信号
    }

下载地址:QT简单实现多线程_qt简单的写一个线程-C++文档类资源-CSDN下载

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。