QT多线程详解,QT多线程实现的两种方式案例详解
这篇文章主要介绍了QT实现多线程两种方式案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下。
Qt4.7之前版本处理步骤
1.自定义一个类,继承于QThread。
class MyThread:public QThread{public: vid run();//虚函数 线程处理函数(和主线程不在同一个线程) signals: void isDone();//信号 线程执行完发送}void MyThread::run() { // 实现 -- 复杂的处理过程 emit isDome;// 发送线程};
2.定义线程
MyThread thread;
3.开启线程
thread.start();
不能通过直接调用run()函数,通过start()函数间接调用run()函数。
4.自定义线程结束槽函数
public:void dealDone();——————————————————————void Widget::dealDone(){ // 线程结束后的操作}
5.绑定线程结束信号和线程结束槽
connect(&thread,&MyThread::isDone,this,&Widget::dealDone);
6.定义线程关闭槽函数
void Widget::stopThread(){ // 停止线程 thread->quit(); // 等待线程运行完成之后结束 thread->wait();}
建议不要使用terminate()容易出现内存问题
建议使用quit()
7.绑定窗口关闭信号和线程关闭槽函数
connect(this,&Widget::destroyed,this,&Widget::stopThread);
新用法处理步骤
1.设定一个类,继承于QObject。
2.类中设置一个线程函数(只有一个函数是线程函数)和线程开始信号。
class MyThread : public QObject{ Q_OBJECTpublic: explicit MyThread(QObject *parent = nullptr); void run(); void start(); void stop();signals: void myThreadrun();private: bool isrun;public slots:};void MyThread::run(){ while(isrun == true) { QThread::sleep(1); emit myThreadrun(); qDebug() << "子线程:" << QThread::currentThread(); if(isrun == false) break; }}void MyThread::start() { qDebug() << "开始"; this->isrun = true;}void MyThread::stop(){ qDebug() << "停止"; this->isrun = false;}
3.创建线程对象(不能指定对象)和 QThread子线程对象
MyThread *mythread;
QThread *thread;
this->mythread = new MyThread;
this->thread = new QThread(this);
4.处理事件、鼠标按下开启和关闭事件、窗口关闭事件处理
void Widget::dealThread() {static int i = 0; i++; ui->lcdNumber->display(i);}void Widget::on_pushButton_strat_clicked(){ if(thread->isRunning() == true){ return; } thread->start(); mythread->start(); emit runThread();}void Widget::on_pushButton_stop_clicked(){ if(thread->isRunning() == false){ return; } mythread->stop(); thread->quit(); thread->wait();}void Widget::dealThreadclose() { on_pushButton_stop_clicked(); delete mythread;}
5.把自定义线程类加到子线程
mythread->moveToThread(thread);connect(mythread,&MyThread::myThreadrun,this,&Widget::dealThread);
6.启动子线程,只是把线程启动了,并没有启动线程处理函数。
C++
connect(mythread,&MyThread::myThreadrun,this,&Widget::dealThread);
connect(this,&Widget::runThread,mythread,&MyThread::run);
qDebug() << "主线程:" << QThread::currentThread();
connect(this,&Widget::destroyed,this,&Widget::dealThreadclose);
本文地址:百科问答频道 https://www.neebe.cn/wenda/903088.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!