c++跨模块调用函数
例:要在检测模块A(ASever)返回检测结果给检测模块B(BDetection)。其中与两个模块同级的有C_handle.cpp文件及头文件。
基本思路:在A检测模块每次检测完毕则调用B检测模块的函数,将结果更新过去。
要解决A检测模块调用B检测模块函数,可以将函数作为参数传入A检测模块。
具体实现过程:
在A检测模块最外层文件A_server_handle.cpp文件中,实现以下函数,并在初始化时调用,将函数传入进来。
- 首先定义函数类型,并将Chandle.cpp中的函数传入A检测模块
typedef std::function<void(long long, std::vector<cv::Rect>)> AResult;
void AServerHandle_setAServerListener(const AResult& listener)
{
A_server_->setAServerListener(listener);
}
AServerHandle_setAServerListener([&](long long tms, std::vector<cv::Rect> objs){
CHandle_recvAInfo(tms, objs);
});
将该函数传入A检测算法模块的实现文件A_helper.cpp。
void AServer::setAServerListener(const AResult& listener)
{
std::lock_guard<std::mutex> od_lk(A_listener_mutex_);
if(A_listener_ == nullptr)
A_listener_ = listener;
}
...
A_listener_(tms, rects);
在C_handle.cpp中,定义函数
typedef std::function<void(const std::vector<cv::Rect>)> HandleAFunc;
static std::vector<HandleAFunc> handleAFuncList;
void CHandle_recvAInfo(long long tms, const std::vector<cv::Rect> objs)
{
for(auto func : handleAFuncList)
{
func(tms, objs);
}
}
handleAFuncList.push_back(AHandle_updateAInfo);
B检测模块中,B_handle.cpp中,实现上述函数。
void BHandle_updateAInfo( long long tms, const std::vector<cv::Rect> objs)
{
Bdetector_->updateAInfo(tms, objs);
}
在该算法模块的算法实现文件B_detect.cpp中,完成该函数的具体实现
void BDetect::updateAInfo(long long tms, std::vector<cv::Rect> objs)
{
{
std::lock_guard<std::mutex> lk(det_result_mutex);
det_result_.tms = tms;
det_result_.resRect = objs;
}
}
至此,实现了跨模块调用函数。在A检测模块中,调用A_listener_(res) ==》行人检测模块函数的updateAInfo(objs)函数
|