QT 初识线程
【摘要】 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(); //发送完成信号
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)