QT 实现多线程的两种方法

目录

一、子类化QThread类,重写run()函数

1、简介

2、实施流程

1、QThread子类创建

2、主线程包含QTherad类对象

3、cpp函数实现

4、运行结果

​二、实例化QThread,使用QObiect::moveToThread()函数

1、工作类创建

2、主线程类


一、子类化QThread类,重写run()函数

1、简介

QThread类提供了一个与平台无关的线程。一个QThread代表了一个可以在应用程序中可以独立控制的线程。它与进程中的其他线程分享数据但是独立执行。QThread从run()函数开始执行。

2、实施流程

1、QThread子类创建

重写run函数,在run函数中,完成一些复杂操作。

#include <qthread.h>
#include <qdebug.h>

class mythread:public QThread
{
public:
	mythread();
	~mythread();

private:

protected:
	void run();

};

2、主线程包含QTherad类对象

主线程中,包含了mythread的一个对象,m_thread,然后在主线程中通过m_thread控制子线程启停。当然必要时候可以通过信号与槽,进行通信。

class Qt_mutil2 : public QMainWindow
{
    Q_OBJECT

public:
    Qt_mutil2(QWidget *parent = Q_NULLPTR);
	private slots:
	void on_actionopen_triggered();

private:
    Ui::Qt_mutil2Class ui;
	mythread *m_thread;
};

3、cpp函数实现

我在ui界面添加了一个aciton,点击action就触发函数,打印消息。可以验证程序是否运行正常。

#include "Qt_mutil2.h"


mythread::mythread()
{
}

mythread::~mythread()
{
}
void mythread::run()
{
	qDebug() << " my thread";
}
Qt_mutil2::Qt_mutil2(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	m_thread = new mythread();

}
void Qt_mutil2::on_actionopen_triggered()
{
	qDebug() << "action open";
	m_thread->start();
}

4、运行结果

点击“打开”,先是槽函数响应,然后是子线程run函数响应。

二、实例化QThread,使用QObiect::moveToThread()函数

实现流程:
1、工作类创建

2、主线程类创建

1、工作类创建

继承自QObject,想要在线程中完成的工作,放在dowork函数中执行,可以行向函数中传递参数,可依据具体情况定义。

class Worker:public QObject
{
	Q_OBJECT
public:
	Worker();
	~Worker();
	public slots:
	void doWork(QString str) { qDebug() <<str; };
private:
};

2、主线程类

包含了Worker类的一个对象,创建一个QThread对象。

class Qt_mutil2 : public QMainWindow
{
	Q_OBJECT

public:
    Qt_mutil2(QWidget *parent = Q_NULLPTR);
	private slots:
	void on_actionopen_triggered();

private:
    Ui::Qt_mutil2Class ui;
	Worker *worker;
	QThread workerThread;//实例化,QThread

};

3、代码实现

初始化工作类

将工作类移动到线程中去

启动线程(此时,工作函数并没有启动,需要单独调用)

这里我在action槽函数中调用了工作函数。

#include "Qt_mutil2.h"

Worker::Worker()
{
}

Worker::~Worker()
{
}

Qt_mutil2::Qt_mutil2(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	worker = new Worker;//包含,工作类,
	worker->moveToThread(&workerThread);//工作类移到线程中
	workerThread.start();//线程启动,但是不会启动工作函数,但是还需要调用doWork函数,才能运行

}
void Qt_mutil2::on_actionopen_triggered()
{
	qDebug() << "action open";
	worker->doWork(QString("do work"));

}

4、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值