9:多线程(2)

发布于:2025-05-25 ⋅ 阅读:(18) ⋅ 点赞:(0)

方法一: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_OBJECT

public:
    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()
{
    //添加  bool
    while(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_OBJECT

public:
    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();   //xianch
    m_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();
     }

}


网站公告

今日签到

点亮在社区的每一天
去签到