Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。
在这里先介绍一下qt多线程的第一种实现方法,继承qthread并重写run函数。
注意:QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里。如果QThread是在ui所在的线程里生成,那么QThread的其他非run函数都是和ui线程一样的,所以,QThread的继承类的其他函数尽量别要有太耗时的操作,要确保所有耗时的操作都在run函数里。
下面给出通过重写run函数实现多线程的小例子。
- 首先使用qt新建一个widget项目,然后在项目里添加MyThread类。
- MyThread类继承QThread类,并在cpp文件里重写run函数。
- 在widget中使用start函数开启线程,启动run函数。
- run函数结束之前会发送finished信号,可自定义槽函数。
mythread.h文件
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
public:
MyThread();
void closeThread();
protected:
virtual void run();
private:
volatile bool isStop; //isStop是易失性变量,需要用volatile进行申明
};
#endif // MYTHREAD_H
mythread.cpp文件
#include "mythread.h"
#include <QDebug>
#include <QMutex>
MyThread::MyThread()
{
isStop = false;
}
void MyThread::closeThread()
{
isStop = true;
}
void MyThread::run()
{
while (1)
{
if(isStop)
return;
qDebug()<<tr("mythread QThread::currentThreadId()==")<<QThread::currentThreadId();
qDebug()<<"66";
sleep(1);
}
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#pragma execution_character_set("utf-8")
#include <QWidget>
#include <mythread.h>
#include <QPushButton>
#include <QVBoxLayout>
#include <QMutex>
#include <ui_widget.h>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
Ui::Widget *ui;
Ui::Widget *getUi() const;
void setUi(Ui::Widget *newUi);
signals:
void uiChanged();
private slots:
void openThreadBtnSlot();
void closeThreadBtnSlot();
void finishedThreadBtnSlot();
// void testBtnSlot();
private:
QVBoxLayout *mainLayout;
MyThread *thread1;
Q_PROPERTY(Ui::Widget * ui READ getUi WRITE setUi NOTIFY uiChanged)
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <windows.h>
#include<ui_widget.h>
Widget::Widget(QWidget *parent)
: QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->openThreadBtn,SIGNAL(clicked(bool)),this,SLOT(openThreadBtnSlot()));
connect(ui->closeThreadBtn,SIGNAL(clicked(bool)),this,SLOT(closeThreadBtnSlot()));
//connect(thread1,SIGNAL(finished()),this,SLOT(finishedThreadBtnSlot()));
}
Ui::Widget *Widget::getUi() const
{
return ui;
}
void Widget::setUi(Ui::Widget *newUi)
{
if (ui == newUi)
return;
ui = newUi;
emit uiChanged();
}
void Widget::openThreadBtnSlot()
{
//开启一个线程
thread1 = new MyThread;
thread1->start();
qDebug()<<"thread id:"<<QThread::currentThreadId();
}
void Widget::closeThreadBtnSlot()
{
//关闭多线程
thread1->closeThread();
connect(thread1,SIGNAL(finished()),this,SLOT(finishedThreadBtnSlot()));
thread1->quit();
thread1->wait();
}
void Widget::finishedThreadBtnSlot()
{
qDebug()<<tr("完成信号finished触发");
}
Widget::~Widget()
{
}
main.cpp文章来源:https://www.toymoban.com/news/detail-632412.html
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
注意在widget.ui里面添加两个按钮openThreadBtn和closeThreadBtn控制线程的开启和结束。文章来源地址https://www.toymoban.com/news/detail-632412.html
到了这里,关于【QT多线程一】继承QThread,重写run函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!