一、实现效果
这里是 5 个线程( t 0 , t 1 , t 2 , t 3 , t 4 t0 , t1 , t2 , t3 , t4 t0,t1,t2,t3,t4),循环打印 (0 ~ 9):
二、实现
创建一个名为 ThreadDialog
(项目名随便取)的项目,基类名也是 ThreadDialog
,旋转继承 QDialog
。
点击添加一个 WorkThread
类,让它继承 QThread
类。
threaddialog.h:
#ifndef THREADDIALOG_H
#define THREADDIALOG_H
#include <QDialog>
#include <QPushButton>
#include "workthread.h"
//创建的线程数量,这里我设置最多创建5个
const int MAX_SIZE = 5;
class ThreadDialog : public QDialog
{
Q_OBJECT
public:
ThreadDialog(QWidget *parent = nullptr);
~ThreadDialog();
public slots:
void slotStart();
void slotStop();
private:
QPushButton * startBtn;
QPushButton * stopBtn;
QPushButton * quitBtn;
//线程数组
WorkThread * workThread[MAX_SIZE];
};
#endif // THREADDIALOG_H
workthread.h:
#ifndef WORKTHREAD_H
#define WORKTHREAD_H
#include <QThread>
class WorkThread : public QThread
{
Q_OBJECT
public:
WorkThread();
protected:
void run() override;
};
#endif // WORKTHREAD_H
threaddialog.cpp :
#include "threaddialog.h"
#include <QHBoxLayout>
ThreadDialog::ThreadDialog(QWidget *parent)
: QDialog(parent)
{
this->setWindowTitle(tr("多线程"));
startBtn = new QPushButton(tr("开始"));
stopBtn = new QPushButton(tr("停止"));
quitBtn = new QPushButton(tr("退出"));
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 ThreadDialog::slotStart(){
for(int i = 0;i < MAX_SIZE;i++){
workThread[i] = new WorkThread();
workThread[i]->setObjectName("t" + QString::number(i));
}
for(int i = 0;i < MAX_SIZE;i++){
workThread[i]->start();
}
startBtn->setEnabled(false);
stopBtn->setEnabled(true);
}
void ThreadDialog::slotStop(){
for(int i = 0;i < MAX_SIZE;i++){
workThread[i]->terminate();
workThread[i]->wait();
}
startBtn->setEnabled(true);
stopBtn->setEnabled(false);
}
ThreadDialog::~ThreadDialog()
{
}
workthread.cpp:
#include "workthread.h"
#include <QtDebug>
WorkThread::WorkThread()
{
}
void WorkThread::run(){
while(true){
for(int i = 0;i < 10;i++){
qDebug()<<objectName()<<" : "<<i;
}
}
}
main.cpp :
#include "threaddialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ThreadDialog w;
w.show();
return a.exec();
}