多线程多线程,让人头大也头疼。之前代码一把撸,最近打算好好理一下。
一、多线程的优势
(1)提高应用程序的响应速度,UI防卡死。
(2)系统调度不同的线程,使其运行在不同的CPU上。
(3)改善程序结构。拆分代码,利于理解与维护代码。
二、多线程程序的特点
(1)无序。
(2)随时随地切换线程。
(3)代码敏感度高。
(4)运行结果不完全相同。
三、继承QThread,重写run()函数
分享给有需要的人,代码质量勿喷。
3.1 主线程MultiThreadTest
MultiThreadTest.h
#ifndef MULTI_THREAD_TEST_H
#define MULTI_THREAD_THET_H
#pragma execution_character_set("utf-8")
#include <QtWidgets/QMainWindow>
#include "ui_MultiThreadTest.h"
//local
#include "WorkThread.h"
class MultiThreadTest : public QMainWindow
{
Q_OBJECT
public:
MultiThreadTest(QWidget *parent = Q_NULLPTR);
public slots:
void on_pushButtonStart_clicked();
void on_pushButtonStop_clicked();
private:
Ui::MultiThreadTestClass ui;
WorkThread *workThread[10];
};
#endif // !MULTI_THREAD_THET_H
MultiThreadTest.cpp
#include "MultiThreadTest.h"
MultiThreadTest::MultiThreadTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.pushButtonQuit, SIGNAL(clicked()), this, SLOT(close()));
}
void MultiThreadTest::on_pushButtonStart_clicked()
{
for (int i = 0; i < ui.spinBoxThread->value(); i++)
{
workThread[i] = new WorkThread();
}
for (int i = 0; i < ui.spinBoxThread->value(); i++)
{
workThread[i]->start();
}
ui.pushButtonStart->setEnabled(false);
ui.pushButtonStop->setEnabled(true);
}
void MultiThreadTest::on_pushButtonStop_clicked()
{
for (int i = 0; i < ui.spinBoxThread->value(); i++)
{
workThread[i]->terminate();
workThread[i]->wait();
}
ui.pushButtonStart->setEnabled(true);
ui.pushButtonStop->setEnabled(false);
}
3.2 线程类WorkThread
MultiThreadTest.h
#ifndef MOEK_THREAD_H
#define MOEK_THREAD_H
#include <QThread>
#include <QtDebug>
#include <QFile>
class WorkThread : public QThread
{
Q_OBJECT
public:
WorkThread();
protected:
void run();
};
#endif // !MOEK_THREAD_H
MultiThreadTest.cpp
#include "WorkThread.h"
WorkThread::WorkThread() {}
void WorkThread::run()
{
while (true)
{
for (int i = 0; i < 10; i++)
{
QFile xjFile("F:/test.las");
if (myFile.open(QIODevice::ReadOnly))
{
int size = xjFile.size();
xjFile.close();
qDebug() << size << i << i << i << i << i << i;
}
}
}
}
四、试验结果
单线程是有序的,多线程是无序的。
五、参考文献
[1]陆文周. Qt 5 开发及实例[M].北京:电子工业出版社, 2015: 326-330.