ZBLOG

class DataProcessThread : public QObject, public QRunnable { Q_OBJECT public: explicit DataProcessThread(QObject *parent = nullptr); ~DataProcessThread(); void pushInfo(ImageInfo imgInfo); void stopRun(); protected: void ...

要启动 DataProcessThread 类的线程并在其中执行任务,你需要将这个类与 QThreadPoolQRunnable 结合使用。下面是一个详细的步骤和示例代码,展示如何启动该线程。

步骤

  1. 创建 DataProcessThread 实例: 创建一个 DataProcessThread 对象。
  2. 将对象添加到线程池: 使用 QThreadPool::start() 方法来运行你的线程。
  3. 通过信号和槽机制进行通信: 当任务完成后,可以通过定义的信号通知主线程或其他对象。

示例代码

下面是如何实现这些步骤的示例:

#include <QCoreApplication>
#include <QRunnable>
#include <QThreadPool>
#include <QMutex>
#include <QList>
#include <QObject>
#include <iostream>

class ImageInfo {
    // 这里定义你的ImageInfo结构体或类
public:
    QString imagePath; // 示例成员变量
};

class DataProcessThread : public QObject, public QRunnable
{
    Q_OBJECT
public:
    explicit DataProcessThread(QObject *parent = nullptr) : QObject(parent), m_abort(false), m_iSaveNum(0) {}

    ~DataProcessThread() {}

    void pushInfo(ImageInfo imgInfo) {
        QMutexLocker locker(&m_mutexImgInfoList);
        m_imgInfoList.append(imgInfo);
    }

    void stopRun() {
        m_abort = true;
    }

protected:
    void run() override {
        while (!m_abort) {
            // 执行数据处理逻辑,假设我们处理每个ImageInfo并保存信息
            
            // 检查是否有待处理的信息
            if (!m_imgInfoList.isEmpty()) {
                QMutexLocker locker(&m_mutexImgInfoList);
                ImageInfo info = m_imgInfoList.takeFirst(); // 获取第一个元素
                
                // 假设这里进行某种处理,比如保存图片等...
                std::cout << "Processing image at path: " << info.imagePath.toStdString() << std::endl;
                
                emit recvCheckFinishSignal("CameraType", info.imagePath); // 发出信号告知图像处理完成
                
                ++m_iSaveNum; // 增加存储数量
                emit sigSaveNum(m_iSaveNum, nullptr); // 发出信号传递存储数量及句柄(如果有的话)
            }
        }
    }

signals:
    void recvCheckFinishSignal(QString camType, QString path);
    void sigSaveNum(int iSaveNum, void* pHandle);

private:
    QMutex m_mutexImgInfoList;
    QList<ImageInfo> m_imgInfoList;

    bool m_abort;
    int m_iSaveNum; // 存储个数
};

// 主函数中使用 QThreadPool 启动线程
int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    
    QThreadPool threadPool;

    DataProcessThread *dataProcessor = new DataProcessThread();

    QObject::connect(dataProcessor, &DataProcessThread::recvCheckFinishSignal,
                     [](QString camType, QString path){
                         std::cout << "Finished processing for camera type: " << camType.toStdString()
                                   << ", Path: " << path.toStdString() << std::endl;
                     });

   QObject::connect(dataProcessor, &DataProcessThread::sigSaveNum,
                    [](int saveCount, void* handle){
                        std::cout << "Number of images saved: " << saveCount << std::endl;
                    });

   dataProcessor->pushInfo({"/path/to/image1.jpg"});  // 添加图像信息到队列
   dataProcessor->pushInfo({"/path/to/image2.jpg"});

   threadPool.start(dataProcessor);  // 将任务提交到线程池中

   return a.exec();
}

解释:

  1. Image Processing Logic:在 run() 方法中,我们使用了一个循环来不断检查是否有待处理的图像。如果有,就从列表中取出并执行相关操作。

  2. 信号与槽连接:使用 Qt 的信号和槽机制来处理图像时发出通知。例如,当图像处理完成时,会发出 recvCheckFinishSignal 信号。

  3. 多任务管理:你可以添加多个任务,通过调用 pushInfo() 方法将不同的 ImageInfo 对象放入列表,然后提交到线程池。这些操作都是安全的,因为我们对共享资源(即图像信息列表)进行了互斥锁保护。

  4. 停止操作:提供了 stopRun() 方法用于设置标志位以安全地退出循环,可以根据需要在合适的时候调用此方法来终止正在运行的任务。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21855

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?