当前位置:网站首页>Qtthread, one of many methods of QT multithreading
Qtthread, one of many methods of QT multithreading
2022-07-07 06:12:00 【Wen teased to death】
QThread It seems to be a very difficult thing , Especially signals and slots . The following is only a simple case written during my study .
QThread How to use multithreading
QThread Class provides a platform independent method of managing threads . stay Qt The main purpose of establishing threads in is to use threads to deal with those time-consuming background operations , For example, a large number of operations , Copy big files , Network transmission, etc .
Use Qt Framework when developing applications , Use QThread Class can easily and quickly create and manage multithreads .
Communication between multiple threads can also be used Qt Peculiar “ The signal - Slot ” Mechanism realization .
QThread There are two ways to use :
- Inherit QThread class
- QObject::moveToThread()
Inherit QThread Method
The first method is simple , It's easy to understand , Write a class inheritance QThread class , And rewrite run() function , And generate a ChildThread Example , And call the object's start() function .
Interface (.h):
#ifndef THREADDLG_H
#define THREADDLG_H
#include <QDialog>
#include <QPushButton>
#include "workthread.h"
#define MAXSIZE 5 //MAXSIZE The macro defines the number of threads
class ThreadDlg : public QDialog
{
Q_OBJECT
public:
ThreadDlg(QWidget *parent = 0);
~ThreadDlg();
private:
QPushButton *startBtn;
QPushButton *stopBtn;
QPushButton *quitBtn;
workThread *myThread[MAXSIZE]; // Create thread pointer array
public slots:
void slotStart(); // The slot function is used to start the thread
void slotStop(); // The slot function is used to terminate the thread
};
#endif // THREADDLG_H
Interface (.cpp):
#include "threaddlg.h"
#include <QHBoxLayout>
ThreadDlg::ThreadDlg(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr(" Threads "));
startBtn = new QPushButton(tr(" Start "));
stopBtn = new QPushButton(tr(" stop it "));
quitBtn = new QPushButton(tr(" sign out "));
QHBoxLayout *mainLayout = new QHBoxLayout(this);
mainLayout->addWidget(startBtn);
mainLayout->addWidget(stopBtn);
mainLayout->addWidget(quitBtn);
connect(startBtn,SIGNAL(clicked()),this,SLOT(slotStart()));
connect(stopBtn,SIGNAL(clicked()),this,SLOT(slotStop()));
connect(quitBtn,SIGNAL(clicked()),this,SLOT(close()));
}
void ThreadDlg::slotStart()
{
for(int i=0;i<MAXSIZE;i++)
{
myThread[i]=new workThread(); // Create five threads
}
for(int i=0;i<MAXSIZE;i++)
{
myThread[i]->start(); // Start these five threads
}
startBtn->setEnabled(false);
stopBtn->setEnabled(true);
}
void ThreadDlg::slotStop()
{
for(int i=0;i<MAXSIZE;i++)
{
myThread[i]->terminate();// End these five threads
myThread[i]->wait();// Blocking waiting for processing to end
}
startBtn->setEnabled(true);
stopBtn->setEnabled(false);
}
ThreadDlg::~ThreadDlg()
{
}
Thread class :(.h)
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include <QThread>
class workThread:public QThread
{
public:
workThread();
protected:
void run();
};
#endif // WORKTHREAD_H
If you want the main thread to pass parameters to the child thread , Constructors can be used to interact with data .
Thread class :(.cpp)
#include "workthread.h"
#include <QDebug>
#include <QVector>
workThread::workThread()
{
}
void workThread::run()
{
QVector<int> nums{
1,2,4,3,6,4,2,2,23434,554,232,323,54,66};
int n = nums.size();
bool isChange = false;
while (true) {
for(int i = 1;i<n;i++){
for(int j = 0;j<n-i-1;j++){
if(nums[j]>nums[j+1])
{
int t = nums[j];
nums[j] = nums[j+1];
nums[j+1] = t;
isChange = true;
}
}
if(!isChange){
break;
}
}
for(int &n:nums){
qDebug()<<n<<" ";
}
}
}
QObject::moveToThread
To be honest, I don't quite understand this method
- Define an ordinary QObject Derived class FileWorker, And then the object move To QThread in .
- Defining a forwarding class is also QObject Subclass , It's called controller, Or call it dummy. The signal slot of the forwarding class and FileWorker Class , In this way, the slot function of the forwarding class is called in the main thread , Or receive the signal OK 了 .
It probably means through the forwarding class , Can make FileWorker The slot function of class runs properly in the sub thread . At the same time, there is no need to use QMutex To synchronize ,Qt The event loop will automatically handle this .
summary
Recommended :
stay QThread Subclasses add signals . It's absolutely safe , And it's true ( The thread dependency of the sender doesn't matter )
What should not be done is :
call moveToThread(this) function
Specify connection type : This usually means that you are doing the wrong thing , For example, will QThread The control interface is mixed with the business logic ( This should be placed in a separate object of the thread )
stay QThread Subclass add slot function : This means that they will be called on the wrong thread , That is to say QThread The thread of the object , instead of QThread Object managed threads . This requires you to specify the connection type or call moveToThread(this) function
Use QThread::terminate() function
What cannot be done is :
Exit the program while the thread is still running . Use QThread::wait() Function waits for the thread to end
stay QThread Destroy the object while the thread managed by the object is still running . If you need something “ Self destruction ” The operation of , You can take finished() The signal is the same as deleteLater() Slots connected
Reference resources :https://blog.csdn.net/zb872676223/article/details/22718087
边栏推荐
- Nvisual network visualization
- [solved] record an error in easyexcel [when reading the XLS file, no error will be reported when reading the whole table, and an error will be reported when reading the specified sheet name]
- jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取
- Rk3399 platform development series explanation (WiFi) 5.52. Introduction to WiFi framework composition
- 蚂蚁庄园安全头盔 7.8蚂蚁庄园答案
- Check Point:企业部署零信任网络(ZTNA)的核心要素
- C. colonne Swapping [tri + Simulation]
- 深度聚类:将深度表示学习和聚类联合优化
- Subghz, lorawan, Nb IOT, Internet of things
- [InstallShield] Introduction
猜你喜欢

693. 行程排序

JVM命令之 jstat:查看JVM统计信息

高并发大流量秒杀方案思路

Jstat of JVM command: View JVM statistics
![[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core](/img/fc/5162bbb0746f8af2d6c7d63ade571a.png)
[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core

JVM命令之 jinfo:实时查看和修改JVM配置参数

jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取

蚂蚁庄园安全头盔 7.8蚂蚁庄园答案
![[SQL practice] a SQL statistics of epidemic distribution across the country](/img/ba/639a23d87094d24572a69575b565b9.png)
[SQL practice] a SQL statistics of epidemic distribution across the country

jvm命令之 jcmd:多功能命令行
随机推荐
Cf:c. column swapping [sort + simulate]
生活中的开销,怎么记账合适
Go language learning notes - Gorm use - native SQL, named parameters, rows, tosql | web framework gin (IX)
jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取
On the difference between FPGA and ASIC
Financial risk control practice - decision tree rule mining template
Deep clustering: joint optimization of depth representation learning and clustering
PTA 天梯赛练习题集 L2-003 月饼 测试点2,测试点3分析
话说SQLyog欺骗了我!
Career experience feedback to novice programmers
Understand the deserialization principle of fastjson for generics
go-microservice-simple(2) go-Probuffer
Go语学习笔记 - gorm使用 - 原生sql、命名参数、Rows、ToSQL | Web框架Gin(九)
980. Different path III DFS
Red hat install kernel header file
jvm命令之 jcmd:多功能命令行
Bypass open_ basedir
软件测试知识储备:关于「登录安全」的基础知识,你了解多少?
Talking about reading excel with POI
Chain storage of stack