问题描述:软件界面打开之前要初始化相机和机械臂,并且在执行扫描点云,配准等操作时,只能单线程运行,导致运行效率低。
解决:使用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() | 使线程休眠,单位为秒 / 毫秒 / 微秒 |