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);
}

浙公网安备 33010602011771号