算法部分---处理模块类抽象

文章围绕图像处理模块展开,实现代码解耦,用户层下发数据给模块,模块通过回调函数返回结果。还介绍了声明部分,如处理类模块对应线程、构造纯虚函数等,以及具体实现的 start、stop 等方法,最后总结了类共同部分的抽象和虚函数子类重写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

文章目录

  • 一、声明
  • 二、具体实现
    • 1. start
    • 2. stop
    • 3. setFrame
    • 4. processFrame
  • 总结

图像处理模块公共部分的抽象,实现代码的解耦。大致的功能:user层下发数据给图像处理模块,异步非阻塞等待,图像处理模块回调函数返回user层结果。想起了郑州现场的调试一个人在酒店熬到半夜四点,线程连读不触发的问题。在上电控大冬天的室外安装调试,成像环境完全的改变。地铁站售货柜子的调试,起雾问题。感觉都可以写一部回忆录了,哈哈哈。

一、声明

1. 一个处理类模块对应一个线程,具体涉及到嵌套类,内部类访问外部类需要有该类对象。

2. 构造纯虚函数,作为该类指针,回调返回的结果。

3. 互斥量和条件信号的对应,唤醒等待的线程。

监听类代码如下:

//定义监听类
class ProcessorListener
{
public:
    ProcessorListener() {}
    virtual ~ProcessorListener() {}
    //输出结果的回调
    virtual int postResultFromPrcessor(void* result) = 0;
}

类声明代码如下:

class ImageProcessor
{
/* 定义公有方法或成员变量, 类外可调用 */
public:
    explicit ImageProcessor();
    virtual ~ImageProcessor();

    //callback, listener的设置
    void setListener(ProcessorListener* listener)
    { mListener = listener; }

    //user层调用,下发数据,唤醒thread
    bool setFrame(int id, void* data);

    //process处理的userData,完成后的回调
    bool processFrame();

    //线程的创建, this指针的设置
    bool start();

    //线程的回收, 指针的null
    bool stop();

    //处理线程
    class ProcessThread : public QThread
    {
    public:
        explicit ProcessThread(ImgProcessor* instance)
            : mInstance(instance) { }
        virtual ~ProcessThread() { }

    private:
        ImgProcessor* mInstance;
        QMutex mMutex;
        QWaitCondition mWaitCond;
        void run(); //继承后,成新写
    };

    //处理的数据
    int dataCount;

    //running的flag
    bool mRunFlag;
/* 定义基类私有方法及成员变量, 类内和有元类可访问, 子类不可访问 */
private:
    ProcessThread* mProcessThread;

/* 定义基类受保护方法及成员变量, 子类可访问 */
protected:
    ProcessorListener* mListener;
};

二、具体实现

1. start

代码如下(示例):

//开启线程
bool ImageProcessor::start() {
    if (nullptr == mProcessThread) {
        mProcessThread = new ProcessThread(this);
        mProcessThread->start();
    }

    //data
    dataCount = 0;
    mRunFlag = true;

    return true;
}

2. stop

代码如下(示例):

//线程的回收, 指针的null
bool ImageProcessor::stop() {
    mProcessThread->requestExit();
    delete mProcessThread;
    mProcessThread = nullptr

    //data
    dataCount = 0;
    mRunFlag = false;

    return true;
}

3. setFrame

代码如下(示例):

//user层调用,下发数据,唤醒thread
bool ImageProcessor::setFrame(int id, void* data)
{
    mProcessThread->mMutex.lock();
    dataCount++;
    mProcessThread->mWaitCond.wakeAll();
    mProcessThread->mMutex.lock();

    return true;
}

4. processFrame

代码如下(示例):

//process处理的userData,完成后的回调
bool ImageProcessor::processFrame(int id, void* data)
{
    std::cout<<" not hello world"<<std::endl;
    //1. 预处理
    //preProcess();

    //2. 网络推到
    //netForward();

    //3.后处理
    //postProcess();

    mListener->postResultFromPrcessor(0);

    return true;
}

5. run

代码如下(示例):

//线程的run函数
bool ImageProcessor::ProcessThread::run()
{
    while (mRunFlag) {
        mMutex.lock();
        if ( <= 0){
            mCondition.wait(&mMutex);
        }
        mInstance->process();
        mMutex.unlock();
    }
    
    return true;
}

 


总结

类共同部分的抽象,虚函数子类的重写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值