QThread:moveToThread()实现多线程

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是不相同的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值