QT(6.5) cmake构建C++编程,多线程

QT(6.5) cmake构建C++编程,多线程

1. 先写一个包含要被其他线程调用的函数且继承了QObject的类

#ifndef MY_FUNCTIONS_H
#define MY_FUNCTIONS_H
#include <QObject>
#include <QQmlApplicationEngine>

class My_Functions : public QObject
{
    Q_OBJECT //这个宏要写上
public:
    explicit My_Functions(QObject *parent = nullptr);
    ~My_Functions();

    Q_INVOKABLE bool detectImages(QString  filesPaths);
    void operateFunction(QString mode);

signals:
    void resultReady(QString result); //线程完成工作时发送的信号
private:


};
#endif // MY_FUNCTIONS_H
#include "My_Functions.h"
#include <QDebug>

My_Functions::My_Functions(QObject *parent) : QObject(parent){}
My_Functions:: ~My_Functions(){}

bool My_Functions :: detectImages(QString  filesPaths){
    qDebug()<< "检测图片的函数\n";
    return true;
}

void My_Functions :: operateFunction(QString mode){
    qDebug()<<"收到执行信号:" << mode << "\n";
    qDebug()<<"当前线程号:"<< QThread::currentThreadId() << "\n";  //线程号为第二线程号
    //发送执行信号给Function_Thread执行handleResults方法,参数也传给handleResults
    emit resultReady(mode);  //emit表示发送信号
}

2. 再写一个调用函数类的继承了QObject的类

#ifndef FUNCTION_THREAD_H
#define FUNCTION_THREAD_H

#include <QObject>
#include <QThread>
#include <QDebug>
#include <QQmlApplicationEngine>
#include <my_functions.h>

class Function_Thread : public QObject
{
    Q_OBJECT
public:
    explicit Function_Thread(QObject *parent = nullptr);
    Q_INVOKABLE void startOperateFunction(QString mode);
    ~Function_Thread();
    void handleResults(QString result); //处理线程执行的结果

signals:
    void operate(QString mode); //发送信号触发线程
private:
    QThread* workerThread = NULL;
    My_Functions* my_functions = NULL;
};

#endif // FUNCTION_THREAD_H
#include "function_thread.h"
#include <QQmlContext>
#include <QQmlProperty>
#include <QQmlComponent>

Function_Thread :: Function_Thread(QObject *parent): QObject{parent}{}
Function_Thread :: ~Function_Thread(){}

void Function_Thread :: startOperateFunction(QString mode){
    if(workerThread != NULL && workerThread->isRunning()){
        workerThread->quit();  // 请求线程停止
        workerThread->wait();  // 等待线程彻底结束
        workerThread = NULL;
        my_functions = NULL;
        qDebug()<<"已关闭第二线程\n";
    }
    if(workerThread == NULL || !workerThread->isRunning()){
        workerThread = new QThread;
        my_functions = new My_Functions;
        qDebug()<< "新线程已创建\n";
    }
    my_functions->moveToThread(workerThread);  //调用moveToThread将该任务交给workThread

    //连接类1和类2的方法,当类1的方法发送信号则执行类2的方法,对应参数在发送信号时填入参数列表
    //this为当前实体类,&Function_Thread :: operate为当前类的operate函数地址
    //my_functions为需要调用的函数所在的实体类, &My_Functions :: operateFunction为其函数地址
    connect(this, &Function_Thread :: operate, my_functions, &My_Functions :: operateFunction);  
    connect(workerThread, &QThread::finished, my_functions, &QObject::deleteLater);  //该线程结束时销毁
    connect(my_functions, &My_Functions :: resultReady, this, &Function_Thread ::handleResults);  //线程结束后发送信号,对结果进行处理

    workerThread->start();                //启动线程
    qDebug()<<"将发送执行信号\n";
    qDebug()<<"当前线程号:" << QThread::currentThreadId() <<'\n';  //线程号为主线程号
    //发送执行信号给My_Functions执行operateFunction方法,参数也传给operateFunction
    emit operate(mode);   //emit表示发送信号
    qDebug()<<"执行信号发送完毕!" <<'\n';
}

void Function_Thread :: handleResults(const QString result)                        //处理线程执行的结果
{
    qDebug()<<"收到结果信号\n";
    qDebug()<<"当前线程号:"<< QThread :: currentThreadId() <<'\n';  //线程号为主线程号
    qDebug()<<"结果为:"<< result << "\n";
}

3. 在合适的位置初始化Function_Thread,并调用Function_Thread的方法startOperateFunction去执行其中需要调用的My_Functions的函数

相关推荐

  1. QT(6.5) cmake构建C++编程线

    2024-04-02 11:34:04       15 阅读
  2. C语言线编程-线同步

    2024-04-02 11:34:04       34 阅读
  3. C#线编程详细教学

    2024-04-02 11:34:04       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 11:34:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 11:34:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 11:34:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 11:34:04       18 阅读

热门阅读

  1. C++ hex转uint,uint 互相转换,uint转byte

    2024-04-02 11:34:04       16 阅读
  2. sql注入详解

    2024-04-02 11:34:04       14 阅读
  3. Qt QML 坐标转换函数

    2024-04-02 11:34:04       14 阅读
  4. Python 约瑟夫环问题

    2024-04-02 11:34:04       10 阅读
  5. rust实现UDP服务器

    2024-04-02 11:34:04       14 阅读
  6. 计算矩阵中0的个数

    2024-04-02 11:34:04       14 阅读
  7. 33-1 XXE漏洞 - DTD

    2024-04-02 11:34:04       13 阅读