概要:本期主要讲解Qt中多线程的实现方式。
Qt中主流的多线程实现方式主要是三种:
1.继承QThead类,重写run方法
2.继承QObject类,利用moveToThread方法
3.调用concurrent模块,利用QtConcurrent::run()方法
方式一:继承QThread类
1.创建Qt Application
2.添加一个C++类,继承QThread类
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
public:
MyThread();
//重写run方法
void run();
};
#endif // MYTHREAD_H
#include "mythread.h"
#include <QDebug>
#include <Windows.h>
MyThread::MyThread()
{
}
void MyThread::run()
{
qDebug() << QStringLiteral("线程ID:") << QThread::currentThreadId();//打印子线程的信息
while(true)
{
qDebug() << QStringLiteral("多线程正在执行!");
sleep(3);
}
}
3.上面是继承QThread的子类,放在子线程中执行的操作需要放在run函数中,因为只有run函数会在子线程中执行。接下来只需要调用这个线程类,启动线程即可。
void MainWindow::StartMyThread()
{
qDebug() << QStringLiteral("线程ID:") << QThread::currentThreadId();//打印主线程的信息
MyThread *mThread = new MyThread:
mThread->start();
}
方式二:继承QObject类
1.创建Qt Console Application(用不到界面,看打印信息就行)
2.添加一个C++类,继承QObject类
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <QObject>
class MyObject : public QObject
{
public:
MyObject();
public slots:
void PrintSlot();
};
#endif // MYOBJECT_H
#include "myobject.h"
#include <QThread>
#include <QDebug>
#include <Windows.h>
MyObject::MyObject()
{
}
void MyObject::PrintSlot()
{
qDebug() << QStringLiteral("线程ID:") << QThread::currentThreadId();
while(true)
{
qDebug() << QStringLiteral("多线程正在执行!");
Sleep(3000);
}
}
3.上面是继承QObject的子类,想要放在子线程中的执行的操作,可以在该子类中实现,接下来需要利用Qt的信号槽机制,控制子线程的启动和和退出。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
namespace Ui {
class MainWindow;
}
class MyThread;
class MyObject;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//启动多线程
void StartMyThread();
private:
Ui::MainWindow *ui;
//创建多线程对象
MyThread *mThread;
QThread *mPullThread;
MyObject *mObject;
signals:
void StartThreadSig();
};
#endif // MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
namespace Ui {
class MainWindow;
}
class MyThread;
class MyObject;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//启动多线程
void StartMyThread();
private:
Ui::MainWindow *ui;
//创建多线程对象
MyThread *mThread;
QThread *mPullThread;
MyObject *mObject;
signals:
void StartThreadSig();
};
#endif // MAINWINDOW_H
方式三:QtConcurrent类
上面就是Qt多线程的两种主流写法,此外还有一个方式可以实现多线程,就是QtConcurrent::run(),需要引入concurrent模块,具体实现。
#include <QtCore>
#include <QtConcurrent>
void printThreadId()
{
qDebug() << "Thread ID:" << QThread::currentThreadId();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个QFutureWatcher对象来监视线程的执行
QFutureWatcher<void> watcher;
// 使用QtConcurrent::run函数来创建并发线程
QFuture<void> future1 = QtConcurrent::run(printThreadId);
QFuture<void> future2 = QtConcurrent::run(printThreadId);
// 监视线程的执行
watcher.setFuture(future1);
watcher.setFuture(future2);
// 等待线程执行完毕
future1.waitForFinished();
future2.waitForFinished();
return a.exec();
}
结尾
本期对于Qt实现多线程的学习就到这,下期我们学习JSON文件解析:)