当前位置:网站首页>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]);
总结
善于总结,多进一步。
边栏推荐
- What is a humble but profitable sideline?
- 如何让同步/刷新的图标(el-icon-refresh)旋转起来
- 激光slam学习记录
- Make a short video clip number of we media film and television. Where can I download the material?
- [day39 literature extensive reading] a Bayesian perspective on magnetic estimation
- How to rotate the synchronized / refreshed icon (EL icon refresh)
- Do you regret becoming a programmer?
- [classical control theory] summary of automatic control experiment
- Qt QPushButton详解
- 转:未来,这样的组织才能扛住风险
猜你喜欢
Redis高可用——主从复制、哨兵模式、集群
C reflection and type
Scala concurrent programming (II) akka
Qt QPushButton详解
如何让同步/刷新的图标(el-icon-refresh)旋转起来
Neural structured learning - Part 2: training with natural graphs
Rsync remote synchronization
总结了 800多个 Kubectl 别名,再也不怕记不住命令了!
零犀科技携手集智俱乐部:“因果派”论坛成功举办,“因果革命”带来下一代可信AI
21. PWM application programming
随机推荐
98. Verify the binary search tree ●●
Rethinking about MySQL query optimization
How to get all the values stored in localstorage
QCombox(重写)+QCompleter(自动补全,自动加载qcombox的下拉选项,设置背景颜色)
C file and folder operation
Use CAS instead of synchronized
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?
15 MySQL stored procedures and functions
成为程序员的你,后悔了吗?
做自媒体影视短视频剪辑号,在哪儿下载素材?
14 MySQL view
Open source CRM customer relationship system management system source code, free sharing
Live tiktok shop 2022 latest gameplay card slot overseas live e-commerce new traffic
动态规划 之 打家劫舍
Spire.PDF for NET 8.7.2
Initialize your vector & initializer with a list_ List introduction
MySQL delete uniqueness constraint unique
How to rotate the synchronized / refreshed icon (EL icon refresh)
C reflection and type
TVS管和ESD管的技術指標和選型指南-嘉立創推薦