这篇文章主要介绍了QT实现多线程两种方式案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下。
- class MyThread:public QThread{
- public:
- vid run(); //虚函数 线程处理函数(和主线程不在同一个线程)
-
- signals:
- void isDone(); //信号 线程执行完发送
- }
- void MyThread::run() {
- // 实现 -- 复杂的处理过程
-
- emit isDome; // 发送线程
- };
2.定义线程
MyThread thread;
3.开启线程
thread.start();
不能通过直接调用run()函数,通过start()函数间接调用run()函数。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
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);
- class MyThread : public QObject
- {
- Q_OBJECT
- public:
- 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);
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓