9:多线程(2)
方法一:run方法
WorkThread001.h
#ifndef WORKTHREAD001_H
#define WORKTHREAD001_H#include <QObject>
#include <QThread> //线程
class WorkThread001 : public QThread
{Q_OBJECT
public:WorkThread001();bool Status006=false; //控制线程的 一个变量void run();void SetBoolStatus0();void SetBoolStatus1();signals:void SendAnSignals(int x ,int y);};#endif // WORKTHREAD001_H
WorkThread001.cpp
#include "WorkThread001.h"#include <qdebug.h>
WorkThread001::WorkThread001()
{}void WorkThread001::run()
{//线程qDebug()<<"enter11";// for (int i=0 ;i<=30;i++)
// {
// qDebug()<<"i:="<<i;
// msleep(100);
// }int i=0;while(1){if(Status006){qDebug()<<"i:="<<i;i++;}}//自带一个信号
}void WorkThread001:: SetBoolStatus0()
{Status006=true;
}
void WorkThread001:: SetBoolStatus1()
{Status006=false;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <./WorkThread01/WorkThread001.h>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();WorkThread001 *m_pWorkThread001=NULL;private slots:void on_pB_StartThread_clicked();void on_pushButton_clicked();void RobticsCatch();void on_pB_StopThread_clicked();void on_rB_StopCap_clicked();void on_rB_KeepCap_clicked();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
#include <qmessagebox.h>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_pWorkThread001=new WorkThread001();//自带 一个信号 , finished 没有参数列表connect(m_pWorkThread001,SIGNAL(finished()),this,SLOT(RobticsCatch()));
}MainWindow::~MainWindow()
{if(m_pWorkThread001){delete m_pWorkThread001;}delete ui;
}void MainWindow::on_pB_StartThread_clicked()
{qDebug()<<"ener1";m_pWorkThread001->start(); //默认 执行run函数}void MainWindow::on_pushButton_clicked()
{bool Status=m_pWorkThread001->isFinished();if(Status){QMessageBox::warning(this,"warning","thread is finished");return;}else{QMessageBox::warning(this,"warning","thread is runing");return;}
}void MainWindow::RobticsCatch()
{qDebug()<<"RobticsCatch()";
}void MainWindow::on_pB_StopThread_clicked()
{if(m_pWorkThread001->isRunning()){qDebug()<<"enter quit";//BOOL ----方法1 ,ui 修改 bool 变量//强制 推出m_pWorkThread001->terminate(); //强制退出m_pWorkThread001->wait(); //等待m_pWorkThread001->quit();m_pWorkThread001->exit();}
}void MainWindow::on_rB_StopCap_clicked()
{m_pWorkThread001->SetBoolStatus1(); //STOP}void MainWindow::on_rB_KeepCap_clicked()
{m_pWorkThread001->SetBoolStatus0(); //STOP
}
此方法不好管理多线程
方法二:thread方法
WorkThread2.h
#ifndef WORKTHREAD2_H
#define WORKTHREAD2_H
#include <qobject.h>class WorkThread2 : public QObject
{Q_OBJECT
public:WorkThread2();void ImageCapture(); //只是 普通函数public slots:};#endif // WORKTHREAD2_H
WorkThread2.cpp
#include "WorkThread2.h"
#include <QDebug>
int i=0;
WorkThread2::WorkThread2()
{}void WorkThread2::ImageCapture()
{//添加 boolwhile(1){qDebug()<<"i:="<<i;i++;}}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <WorkThread2.h>#include <QThread>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_clicked();void on_pB_Cap0_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;WorkThread2 *m_pWorkThread[3]; //采图流程QThread *m_pQThread[3]; //线程指针数组signals:void SendCam0Cap();};#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qdebug.h>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{m_pWorkThread[0]->ImageCapture();
}void MainWindow::on_pB_Cap0_clicked()
{m_pWorkThread[0]=new WorkThread2(); //第一个流程类m_pQThread[0]=new QThread(); //xianchm_pWorkThread[0]->moveToThread(m_pQThread[0]);//connect(this,SIGNAL(SendCam0Cap()),m_pWorkThread2[0],SLOT(ImageCapture()));connect(this,&MainWindow::SendCam0Cap,m_pWorkThread[0],&WorkThread2::ImageCapture);m_pQThread[0]->start();emit SendCam0Cap();
}void MainWindow::on_pushButton_2_clicked()
{if(m_pQThread[0]->isRunning()){qDebug()<<"enter quit";//BOOL ----方法1 ,ui 修改 bool 变量//强制 推出m_pQThread[0]->terminate(); //强制退出m_pQThread[0]->wait(); //等待m_pQThread[0]->quit();m_pQThread[0]->exit();}}