欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QThread:moveToThread()实现多线程

程序员文章站 2022-05-10 12:30:25
...

Qt实现多线程

Qt实现多线程有两种方式:
(1)继承QThread,重写run()方法
(2)使用moveToThread()

本文仅用第二种方法来实现多线程

创建步骤

1.新建thread项目

QThread:moveToThread()实现多线程

2.添加新类MyWork

QThread:moveToThread()实现多线程
右键项目->添加新文件->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中添加两个按钮
QThread:moveToThread()实现多线程
两个按钮的点击事件

void MainWindow::on_startButton_clicked()
{
    t->start();
    qDebug()<<"t start.";
}

void MainWindow::on_quitButton_clicked()
{
    t->quit();
    t->wait();
    qDebug()<<"t quit.";
}

运行成功
QThread:moveToThread()实现多线程
可以看到,主线程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.";
}

运行结果:
QThread:moveToThread()实现多线程
可以看到,两个次线程ID是不相同的

相关标签: qt