自学内容网 自学内容网

QT:QThread 使用案例

问题描述:软件界面打开之前要初始化相机和机械臂,并且在执行扫描点云,配准等操作时,只能单线程运行,导致运行效率低。

解决:使用QThread

首先写一个类如task,成员函数执行的是需要在子线程运行。

task.h: task类需要继承QObject类,startadd()函数内容在子进程运行。

#ifndef TASK_H
#define TASK_H

#include <QThread>
#include <QObject>
class task: public QObject
{
    Q_OBJECT

public:
    explicit task(QObject *parent = 0);

public slots:
    void startadd();

};



#endif // TASK_H

task.cpp:输出线程id,并且隔一秒输出i的值。

#include "task.h"
#include <QDebug>

task::task(QObject *parent){

}
void task::startadd(){

        qDebug() << "线程id:" << QThread::currentThreadId();
        for(int i=0;i<5;i++)
        {

           qDebug()<<"i的值为: "<< i <<endl;
               QThread::sleep(1);

        }
}

mainwindow.h:声明task的对象,并且声明一个线程m_thread,创建一个转到按钮的槽函数,创建信号函数,后面使用emit触发。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "task.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    task *m;
    QThread * m_thread;

signals:
    void startAddRequest();

private slots:
    void on_pushButton_clicked();


};
#endif // MAINWINDOW_H

mainwindow.cpp:

总结:五步曲
1.类的对象,线程

    m= new task;
    m_thread = new QThread;

2.关联信号和槽,运行startAddRequest()时,触发m对象的函数startadd()

   connect(this,SIGNAL(startAddRequest()),m,SLOT(startadd()));

    qDebug() << "主线程id:" << QThread::currentThreadId();

3.将对象移动m到线程m_thread

    m->moveToThread(m_thread);

4.启动线程

    m_thread->start();

5.发出信号

emit startAddRequest();

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>

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

    m= new task;
    m_thread = new QThread;

    connect(this,SIGNAL(startAddRequest()),m,SLOT(startadd()));

    qDebug() << "主线程id:" << QThread::currentThreadId();

    m->moveToThread(m_thread);

    m_thread->start();

}

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


void MainWindow::on_pushButton_clicked()
{
    qDebug() << "线程id:" << QThread::currentThreadId();
    emit startAddRequest();

}

补充:

sleep() / msleep() / usleep()

使线程休眠,单位为秒 / 毫秒 / 微秒


原文地址:https://blog.csdn.net/m0_51650696/article/details/143374642

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!