当前位置:网站首页>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]);
总结
善于总结,多进一步。
边栏推荐
- Spreadjs 15.1 CN and spreadjs 15.1 en
- Rsync remote synchronization
- C# 文件与文件夹操作
- Comparison between webgl and webgpu [3] - vertex buffer
- The use of El cascader and the solution of error reporting
- Spire.PDF for NET 8.7.2
- How to enable relationship view in phpMyAdmin - how to enable relationship view in phpMyAdmin
- 保研笔记二 软件工程与计算卷二(13-16章)
- 开源crm客户关系统管理系统源码,免费分享
- openssl-1.0.2k版本升级openssl-1.1.1p
猜你喜欢
如何让同步/刷新的图标(el-icon-refresh)旋转起来
激光slam学习记录
零犀科技携手集智俱乐部:“因果派”论坛成功举办,“因果革命”带来下一代可信AI
Hcip course notes-16 VLAN, three-tier architecture, MPLS virtual private line configuration
orgchart. JS organization chart, presenting structural data in an elegant way
用列錶初始化你的vector&&initializer_list簡介
Spire Office 7.5.4 for NET
【LeetCode】5. Valid palindrome
TVS管和ESD管的技術指標和選型指南-嘉立創推薦
Tips for using pads router
随机推荐
Switching power supply buck circuit CCM and DCM working mode
How to get all the values stored in localstorage
What is a humble but profitable sideline?
TS type declaration
15 MySQL-存储过程与函数
C reflection and type
Go language introduction detailed tutorial (I): go language in the era
Qt QPushButton详解
Rasa 3. X learning series -rasa x Community Edition (Free Edition) changes
Rasa 3.x 学习系列-Rasa 3.2.1 新版本发布
C# 反射与Type
2022.6.20-6.26 AI行业周刊(第103期):新的小生命
XML配置文件(DTD详细讲解)
[classical control theory] summary of automatic control experiment
Breadth first search open turntable lock
Brushless drive design -- on MOS drive circuit
MySQL replace primary key delete primary key add primary key
VBA fast switching sheet
QCombox(重写)+QCompleter(自动补全,自动加载qcombox的下拉选项,设置背景颜色)
GFS分布式文件系统