QT应用(6)-多线程-4.7以前的版本-示例源码

1.子线程的启动 
      定义对象 myThread myt; 通过函数 myt->start();
2.子线程的结束
      向主线程发信号 sigDone()
      主线程处理

 demo

3.示例代码
   myThread.h
   

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>
class myThread:public QThread
{
    Q_OBJECT
public:
    myThread(QObject *parent = nullptr);
protected:
    //QThread 的虚函数 线程处理函数 不能直接调用
    //通过start()间接调用
    void run();


signals:
    void isDone();

private slots:
};

#endif // MYTHREAD_H

   myThread.cpp
 

#include "mythread.h"

myThread::myThread(QObject *parent):QThread(parent)
{

}
void myThread::run()
{
    sleep(5);
    emit isDone();
}

主线程调用

#include "mainwindow.h"
#include "ui_mainwindow.h"

//1.构造函数时初始化线程+接收子线程 信号(isDone)
//2.点击鼠标时触发线程启动进入run   pmyt_->start();

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
}

MainWindow::~MainWindow()
{
    delete ui;
}

 void  MainWindow::init()
 {
     ptime_=new QTimer(this);
     connect(ptime_,&QTimer::timeout,this,&MainWindow::dealTimeout);
     pmyt_= new myThread(this);
     connect(pmyt_,&myThread::isDone,this,&MainWindow::dealDone);
     connect(this,&MainWindow::destroyed,this,&MainWindow::stopThread);

 }
 //不要用terminate() 操作一半就关了 quit是处理完了再操作
 void MainWindow::stopThread()
 {
     qDebug()<<"stopThread";
     pmyt_->quit();
     pmyt_->wait();
 }
 void MainWindow::dealDone()
 {
     qDebug()<<"接收到子线程结束信号isDone后的处理";
     ptime_->stop();//关闭定时器
 }

 //启动进入run
void MainWindow::on_start_btn_clicked()
{

    if(ptime_->isActive()==false)
    {
        ptime_->start(100);
    }
    //调用线程
    pmyt_->start();

}

void  MainWindow::dealTimeout()
{
    static int i=0;
    i++;
    ui->lcdNumber->display(i);
}


 

posted @ 2021-01-16 16:47  jasmineTang  阅读(98)  评论(0)    收藏  举报