QT 主线程提取子线程中不断刷新的数据

最近一直在思考如何在子线程中不断刷新数据,然后主线程按照需求从子线程中提取数据出来保存。

这个问题在google上搜索了很久,得到的结果通常都是先介绍一圈QThread的用法,然后说线程的原理,使用方法等等。与我想要的答案不是直接相关。所以打算自己写一个demo。

下面的代码介绍如何在子线程中不断的刷新数据,然后主线程按照一定的时间间隔提取出来。

代码很简单,但是很适合新手QT阅读。

效果图如下:

QT 主线程提取子线程中不断刷新的数据_第1张图片

 

首先是定义线程类,在这个类当中,新申明了子线程中的数据和提取数据的函数,以便主线程中使用。

// mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include 


class mythread : public QThread{
    Q_OBJECT

public:
    mythread();  //构造函数

    int getData();

protected:
    void run();
    int mythread_data;
};


#endif // MYTHREAD_H

写完mythread.h文件后,写mythread.cpp文件,对函数进行填写。

// mythread.cpp

#include "mythread.h"
#include 

mythread::mythread()
{
    mythread_data = 0;
    qDebug() << "mythread线程已建立,建立该线程的ID是 : " << QThread::currentThreadId();
}

int mythread::getData()
{
    return mythread_data;
}

void mythread::run()
{
    qDebug() << "mythread run 线程正在运行中,ID是: " << QThread::currentThreadId();
    while(true){
        mythread_data ++;
        msleep(50);
    }
    qDebug()<<"mythread end.";

}

接下来就是主函数的编写。

// mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include "mythread.h"

class mythread;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:

    void on_end_btn_clicked();
    void on_str_btn_clicked();
    void on_str_thread_btn_clicked();
    void on_end_thread_btn_clicked();

    void displayResult();
    void setnumb();
    void change_thread_data();

private:
    Ui::MainWindow *ui;
    QTimer *timer;
    QTimer *timer_thread;
    mythread *m_mythread;
    int main_data = 0;

};

#endif // MAINWINDOW_H
// mainwindow.cpp

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



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

    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(setnumb()));
    timer->setTimerType(Qt::PreciseTimer);

    timer_thread = new QTimer(this);
    m_mythread = new mythread();
    connect(timer_thread,SIGNAL(timeout()),this,SLOT(displayResult()));
}

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

//系统提供的槽函数

void MainWindow::on_end_btn_clicked()
{
    timer->stop();
}

void MainWindow::on_str_btn_clicked()
{
    timer->start(1000);
}

void MainWindow::on_str_thread_btn_clicked()
{
    timer_thread->start(0);
    m_mythread->start();

}

void MainWindow::on_end_thread_btn_clicked()
{
    timer_thread->stop();
    m_mythread->terminate();
    qDebug()<<"子线程被强行结束。";
}

void MainWindow::displayResult()
{
    main_data = m_mythread->getData();
    ui->lineEdit_thread->setText(QString::number(main_data));
}

// 自己写的槽函数

void MainWindow::setnumb()
{
    ui->lineEdit->setText(QString::number(main_data));
}

void MainWindow::change_thread_data()
{
    ui->lineEdit_thread->setText(QString::number(m_mythread->getData()));
}




// main.cpp

#include "mainwindow.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

上面这个项目是我用QT Creator建立的项目编写的。所以关于有写botton的connect并没有在代码中提现。

下面附上该项目建立的一个GUI

QT 主线程提取子线程中不断刷新的数据_第2张图片

其中

str thread 开启子线程的不断刷新数据功能;

end thread 强行中断子线程;

str 开启主线程的数据获取和显示功能;

end 结束主线程的数据显示;

 

 

 

你可能感兴趣的:(QT 主线程提取子线程中不断刷新的数据)