文章目录
- 一、声明
- 二、具体实现
- 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;
}
总结
类共同部分的抽象,虚函数子类的重写。