目录
二、实例化QThread,使用QObiect::moveToThread()函数
一、子类化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"));
}