Qt实现多线程
Qt实现多线程有两种方式:
(1)继承QThread,重写run()方法
(2)使用moveToThread()
本文仅用第二种方法来实现多线程
创建步骤
1.新建thread项目
2.添加新类MyWork
右键项目->添加新文件->C++ Class ->输入类名MyWork,继承自QObject->确定。
我们所需要实现的功能(函数)都可以放到这个MyWork类
3.为MyWork添加槽函数
在mywork.h中声明两个槽函数
private slots:
void weima();//喂马
void pichai();//劈柴
在mywork.cpp中实现它们
void MyWork::weima()
{
qDebug()<<"我要喂马..."<<"thread ID:"<<QThread::currentThreadId();
}
void MyWork::pichai()
{
qDebug()<<"我要劈柴..."<<"thread ID:"<<QThread::currentThreadId();
}
加上头文件
#include <QDebug>
#include <QThread>
4.使用moveToThread()
在mainwindow.h中声明两个变量
private:
Ui::MainWindow *ui;
QThread *t;
MyWork *mw;
mainwindow.cpp
t = new QThread();
mw = new MyWork();
mw->moveToThread(t);
connect(t,SIGNAL(started()),mw,SLOT(weima()));
connect(t,SIGNAL(started()),mw,SLOT(pichai()));
qDebug()<<"Main thread id:"<<QThread::currentThreadId();
在mainwindow.ui中添加两个按钮
两个按钮的点击事件
void MainWindow::on_startButton_clicked()
{
t->start();
qDebug()<<"t start.";
}
void MainWindow::on_quitButton_clicked()
{
t->quit();
t->wait();
qDebug()<<"t quit.";
}
运行成功
可以看到,主线程ID和线程t的ID是不同的。
而由于两个事件是放在一个线程中,所以是一样的。
可以根据同样的道理创建一个新类DoSports
实现新的函数
//dosports.h
private slots:
void playFootball();
void playBasketball();
将其放进另一线程 t2
//mainwindow.cpp
t2 = new QThread();
ds = new DoSports();
ds->moveToThread(t2);
connect(t2,SIGNAL(started()),ds,SLOT(playFootball()));
connect(t2,SIGNAL(started()),ds,SLOT(playBasketball()));
一样添加按钮,分开控制
void MainWindow::on_startButton2_clicked()
{
t2->start();
qDebug()<<"t2 start.";
}
void MainWindow::on_quitButton2_clicked()
{
t2->quit();
t2->wait();
qDebug()<<"t2 quit.";
}
运行结果:
可以看到,两个次线程ID是不相同的