zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt——多个线程打印数字

Qt线程 数字 多个 打印
2023-09-14 09:14:58 时间

一、实现效果

这里是 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();
}