多线程操作"/>
QT多线程操作
什么是多线程?
- 进程
一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体,是程序执行最小的单位。 - 线程
操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 - 多线程
多个任务同时进行,必须有一个主线程,多个线程之间互不影响。
QT多线程
- 头文件
#include <QThread>
- QT4步骤
(1)自定义线程类
//.h文件
class MyThread : public QThread
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);
protected://QThread的虚函数,线程的处理函数,不能直接调用,通过start()调用void run();
signals:void isDone();
public slots:
};
//.cpp文件
#include "mythread.h"
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{//放入很复杂的数据处理函数emit isDone();
}
(2)线程的实现
//.h文件
#include "mythread.h"
class Widget : public QWidget
{Q_OBJECT
private:Ui::Widget *ui;MyThread *thread1;//创建线程对象
//.cpp文件
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{thread1=new MyThread(this);connect(thread1,&MyThread::isDone,this,&Widget::dealDone);
}
void Widget::on_pushButton_clicked()
{//如果定时器没有工作才启动if(myTimer->isActive()==false){myTimer->start(100);}//启动线程处理数据thread1->start();
}
当按下按钮时,启动了on_pushButton_clicked(),程序先执行myTimer->start(100),当该程序执行完毕之后,定时器打开,开始计数,与此同时,改语句执行完毕,应该执行下一句,由于两个任务不能同时进行,因此需要开启多线程。
- QT5步骤
(1)设定一个类,继承于Qobject
//.h文件
class MyThread : public QObject
{Q_OBJECT
public:explicit MyThread(QObject *parent = nullptr);//线程处理函数void myTimeout();
signals:void mySignal();
public://设置标志位void setFlag1(bool flag=true);
public slots:
private:bool isStop;
};
//.cpp文件
MyThread::MyThread(QObject *parent) : QObject(parent)//添加一个C++class文件继承于QObject
{isStop=false;
}
void MyThread::myTimeout()
{while(isStop=false){QThread::sleep(1);emit mySignal();//每隔一秒,发送一次信号qDebug()<<"子线程号:"<<QThread::currentThread()<<endl;if(isStop==true){break;}}
}
自定义一个类,用于存储线程处理函数,后期加入到线程中,变为“线程类”。
(2)线程的实现
//.h文件
class MyWidget : public QWidget//添加一个C++class文件继承于QObject
{Q_OBJECT
public:explicit MyWidget(QWidget *parent = 0);~MyWidget();void dealSignal();void dealClose();
private slots:void on_buttonStart_clicked();void on_buttonStop_clicked();
signals:void startThread();// 启动子线程的信号
private:Ui::MyWidget *ui;MyThread *myT;QThread *thread;
};//.cpp文件
MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget)
{ui->setupUi(this);myT = new MyThread; //动态分配空间,不能指定父对象,因为后面要给到子线程中去thread = new QThread(this); //创建子线程myT->moveToThread(thread); //把自定义的类加入到子线程中connect(myT,&MyThread::mySignal,this,&MyWidget::dealSignal);//进入线程处理函数connect(this,&MyWidget::startThread,myT,&MyThread::myTimeout);connect(this,&MyWidget::destroyed,this,&MyWidget::dealClose);
}
void MyWidget::on_buttonStart_clicked()
{//启动线程但是没有启动线程处理函数thread->start();myT->setFlag1(false);//不能直接调用线程处理函数,直接调用导致//线程处理函数和主线程在同一个线程//myT->myTimeout();//只能通过signal-slot的方式调用emit startThread();
}
线程函数必须通过signal-slot的方式启动
注:①程序参考自网络教程,方便日后查阅使用
②本示例程序不能直接使用,需要进行相关的配置,请不要直接复制使用,以免浪费时间
更多推荐
QT多线程操作
发布评论