QT:QThread 使用案例
问题描述:软件界面打开之前要初始化相机和机械臂,并且在执行扫描点云,配准等操作时,只能单线程运行,导致运行效率低。
解决:使用QThread
首先写一个类如task,成员函数执行的是需要在子线程运行。
task.h: task类需要继承QObject类,startadd()函数内容在子进程运行。
#ifndef TASK_H
#define TASK_H#include <QThread>
#include <QObject>
class task: public QObject
{Q_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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() | 使线程休眠,单位为秒 / 毫秒 / 微秒 |