当前位置:网站首页>QT--线程
QT--线程
2022-07-05 23:37:00 【我有一颗薄荷糖】
提示:本文为学习记录,若有错误,请联系作者,谦虚受教。
文章目录
前言
去找一个像太阳一样的搭档,帮你晒晒所有的一值不提.
一、QT操作线程
1、通过继承QThread类,重写QThread类的run函数,控制Run函数进行新线程的操作。
2、通过继承QObject类,在新建的类中编写线程操作函数,通过movetothread()函数将新建的类转移到新线程中。
二、继承QThread,重写run()
1.mythread类
mythread.h文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QDebug>
class MyThread : public QThread
{
public:
explicit MyThread(){
}
private:
void run() override;
private slots:
void sig_ShowMsg(QString,bool);
#endif // MYTHREAD_H
mythread.cpp文件
void MyThread::run()
{
//复杂函数的执行
emit sig_ShowMsg("发送成功",true);
}
2.mainwindow
mainwindow.h文件
//定义线程
MyThread* m_thread;
signals:
void slt_ShowMsg(QString ,bool );
mainwindow.cpp文件
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//声明线程
m_thread = new MyThread;
//二者之间通过信号与槽联系
connect(&m_thread,SIGNAL(sig_ShowMsg(QString,bool)),SLOT(slt_ShowMsg(QString ,bool )));
}
//通过按钮触发线程开启
void MainWindow::on_btnstart_clicked()
{
thread->start();//使用该函数的时候会自动调用run函数
qDebug()<<"main thread: "<< QThread::currentThreadId();
emit sig_start();
}
//通过按钮停止线程
void MainWindow::on_btnclose_clicked()
{
//结束线程
thread->exit();
thread->deleteLater();
emit sig_Close();
}
void MainWindoe::slt_ShowMsg(QString a,bool b)
{
ui->text->setText("a");
}
主线程和子线程之间的联系通过信号与槽。
提示:只有在Run函数中的内容才是在新线程中,其他函数都是在旧的线程中。
三、继承QObject,通过moveToThread()
1.MyObject类
//线程处理对象
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <QObject>
#include <QThread>
#include <QDebug>
class MyObject : public QObject
{
Q_OBJECT
public:
explicit MyObject(QObject *parent = 0): QObject(parent){
}
~MyObject(){
}
private slots:
void Start()//线程处理函数
{
qDebug()<<"obj thread: "<<QThread::currentThreadId();
}
};
#endif // MYOBJECT_H
在Mainwindow中使用时,
//定义变量
MyObject* obj;
QThread* thread;
//开始线程
obj = new MyObject;//线程执行对象
thread = new QThread;
obj->moveToThread(thread);//将对象移动到新建立的线程
connect(thread, &QThread::started, obj, &MyObject::Start);//绑定线程的开始信号,线程开始后就会执行obj的Start槽函数
thread->start();
qDebug()<<"main thread: "<<QThread::currentThreadId();
//结束线程
thread->exit();
thread->deleteLater();//删除对象
obj->deleteLater();
使用QObject的方法
- 写一个继承QObject的类,对需要进行复杂耗时逻辑的入口函数声明为槽函数。
- 此类在旧线程new出来,不能给它设置任何父对象
- 同时声明一个QThread,如果不是new,在析构时需要调用QThread::wait(),如果是堆分配的话,可以通过deleteLater让线程自动销毁。
- 把obj通过moveToThread方法转移到新线程中,此时object已经在线程中。
- 把线程的finished信号和object的deleteLater槽连接,这个信号槽必须连接,否则会内存泄漏。
- 正常连接其他信号和槽,通过信号和槽来联系。
- 初始化完后调用QThread::start()来启动线程
- 在逻辑结束后,调用QThread::quit退出线程的事件循环
使用QObject来实现多线程比用继承QThread的方法更加灵活,整个类都是在新的线程中,通过信号槽和主线程传递数据
四、销毁线程
connect(&m_thread,&QThread::finished ,&obj,&QObject::deleteLater);
声明一个QThread,如果不是new,在析构时需要调用QThread::wait(),
如果是堆分配的话,可以通过deleteLater让线程自动销毁。
(堆需要程序员自己手动销毁)
插播:
十进制的显示:
QString test = QString::number(rcvBuf3[5]*256 +rcvBuf3[6]);
QString data = QString::number(rcvBuf3[5]<<8 | rcvBuf3[6]);
总结
善于总结,多进一步。
边栏推荐
- QCombox(重写)+QCompleter(自动补全,自动加载qcombox的下拉选项,设置背景颜色)
- Neural structured learning - Part 2: training with natural graphs
- Comparison between webgl and webgpu [3] - vertex buffer
- Rasa 3.x 学习系列-Rasa X 社区版(免费版) 更改
- Redis high availability - master-slave replication, sentinel mode, cluster
- 妙才周刊 - 8
- 14 MySQL view
- 5. Logistic regression
- C reflection and type
- TVS管和ESD管的技術指標和選型指南-嘉立創推薦
猜你喜欢

21. PWM application programming

Tips for using pads router

JVM details

Do you regret becoming a programmer?

GFS distributed file system

PV静态创建和动态创建

20220703 week race: number of people who know the secret - dynamic rules (problem solution)

Part III Verilog enterprise real topic of "Niuke brush Verilog"

Qt QPushButton详解

What if the C disk is not enough? Let's see how I can clean up 25g of temp disk space after I haven't redone the system for 4 years?
随机推荐
C # input how many cards are there in each of the four colors.
做自媒体影视短视频剪辑号,在哪儿下载素材?
18.(arcgis api for js篇)arcgis api for js点采集(SketchViewModel)
Huawei simulator ENSP - hcip - MPLS experiment
Bao Yan notes II software engineering and calculation volume II (Chapter 13-16)
【LeetCode】5. Valid Palindrome·有效回文
How to enable relationship view in phpMyAdmin - how to enable relationship view in phpMyAdmin
Comparison of parameters between TVs tube and zener diode
GFS Distributed File System
Code farmers to improve productivity
如何让同步/刷新的图标(el-icon-refresh)旋转起来
424. 替换后的最长重复字符 ●●
XML配置文件(DTD详细讲解)
Technical specifications and model selection guidelines for TVs tubes and ESD tubes - recommended by jialichuang
20. Migrate freetype font library
98. 验证二叉搜索树 ●●
2022.6.20-6.26 AI industry weekly (issue 103): new little life
Biased sample variance, unbiased sample variance
My colleagues quietly told me that flying Book notification can still play like this
Which side projects can be achieved? Is it difficult for we media to earn more than 10000 a month?