当前位置:网站首页>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
边栏推荐
- Detailed explanation of platform device driver architecture in driver development
- Subghz, lorawan, Nb IOT, Internet of things
- Jstat pour la commande JVM: voir les statistiques JVM
- 老板总问我进展,是不信任我吗?(你觉得呢)
- @Detailed differences between pathvariable and @requestparam
- Apple CMS V10 template /mxone Pro adaptive film and television website template
- window下面如何安装swoole
- How to improve website weight
- [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]
- [cloud native] what is the microservice architecture?
猜你喜欢

Rk3399 platform development series explanation (WiFi) 5.52. Introduction to WiFi framework composition

A very good JVM interview question article (74 questions and answers)

If you don't know these four caching modes, dare you say you understand caching?

Why does the data center need a set of infrastructure visual management system

Dc-7 target

如果不知道这4种缓存模式,敢说懂缓存吗?

Chain storage of stack

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

每秒10W次分词搜索,产品经理又提了一个需求!!!(收藏)

为不同类型设备构建应用的三大更新 | 2022 I/O 重点回顾
随机推荐
[FPGA tutorial case 14] design and implementation of FIR filter based on vivado core
MFC BMP sets the resolution of bitmap, DPI is 600 points, and gdiplus generates labels
On the difference between FPGA and ASIC
SQL Server 2008 各种DateTime的取值范围
Jcmd of JVM command: multifunctional command line
Career experience feedback to novice programmers
解决pod install报错:ffi is an incompatible architecture
Introduction to the extension implementation of SAP Spartacus checkout process
绕过open_basedir
[云原生]微服务架构是什么?
What EDA companies are there in China?
【FPGA教程案例13】基于vivado核的CIC滤波器设计与实现
Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程
[daily training -- Tencent selected 50] 235 Nearest common ancestor of binary search tree
Dc-7 target
Oracle迁移中关于大容量表使用数据泵(expdp、impdp)导出导入容易出现的问题和注意事项
高并发大流量秒杀方案思路
Flask1.1.4 Werkzeug1.0.1 源碼分析:啟動流程
Understand the deserialization principle of fastjson for generics
mac版php装xdebug环境(m1版)