添加多线程触发相机

master
bobpan 5 years ago
parent 322864e26e
commit 7bf6482e6a

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,43 @@
#include "CThread.h"
CThread::CThread(QObject *parent)
: QThread(parent)
{
m_abort = false;
}
CThread::~CThread()
{
mutex.lock();
m_abort = true;
mutex.unlock();
wait();
}
void CThread::startProcess()
{
m_abort = false;
start();
}
void CThread::stopProcess()
{
mutex.lock();
m_abort = true;
mutex.unlock();
}
void CThread::run()
{
while (1) {
if (m_func)
{
m_func();
}
if(m_abort)
break;
int ms = m_sleepms > 1 ? m_sleepms : 1;
msleep(ms);
}
}

@ -0,0 +1,36 @@
#ifndef _CTHREAD_H_
#define _CTHREAD_H_
#include <QThread>
#include <QMutex>
#include <functional>
typedef std::function<void(void)> TaskFunc;
class CThread : public QThread
{
Q_OBJECT
public:
CThread(QObject *parent = 0);
~CThread();
void startProcess();
void setTaskFunc(TaskFunc func) {
m_func = func;
}
void setSleepms(int m_time = 1)
{
m_sleepms = m_time;
}
public slots:
void stopProcess();
protected:
void run();
private:
bool m_abort;
QMutex mutex;
int m_sleepms{ 10 };
TaskFunc m_func;
};
#endif // ! _CTHREAD_H_

@ -39,10 +39,22 @@ CCoreCtrl::CCoreCtrl(void)
m_gpImgProc = new CImgProc(); m_gpImgProc = new CImgProc();
((CImgProc*)m_gpImgProc)->InitProc(); ((CImgProc*)m_gpImgProc)->InitProc();
TaskFunc func = std::bind(&CCoreCtrl::onRunTask, this);
m_pThread = new CThread();
m_pThread->setSleepms(50);
m_pThread->setTaskFunc(func);
m_pThread->startProcess();
} }
CCoreCtrl::~CCoreCtrl(void) CCoreCtrl::~CCoreCtrl(void)
{ {
if (m_pThread)
{
m_pThread->quit();
delete m_pThread;
m_pThread = nullptr;
}
IFreeCore(); IFreeCore();
if (m_gpImgProc) if (m_gpImgProc)
{ {
@ -72,7 +84,7 @@ int CCoreCtrl::IInitCore(class IDetectorEngine* pDE /*= NULL*/)
/*创建图片处理线程*/ /*创建图片处理线程*/
for (int i = 0; i < nCount; ++i) for (int i = 0; i < nCount; ++i)
{ {
TaskFunc func = std::bind(&CCoreCtrl::onTaskFunc, this); TaskFunc_Bool func = std::bind(&CCoreCtrl::onTaskFunc, this);
lpThread *pThd = new lpThread(func); lpThread *pThd = new lpThread(func);
if( NULL == pThd ) if( NULL == pThd )
{ {
@ -149,7 +161,13 @@ void CCoreCtrl::ISetTriggerMode(emTpDeviceTriggerMode triggerMode, long nFrameRa
void CCoreCtrl::ISnapImage(const QStringList& camKeys) void CCoreCtrl::ISnapImage(const QStringList& camKeys)
{ {
m_camDevManager->ISnapImage(camKeys); //m_camDevManager->ISnapImage(camKeys);
if (camKeys.size() <= 0)
return;
CameraCtrl ctrl;
ctrl.m_ctrlType = 3;
ctrl.strCamName = camKeys.first();
m_safeList.push_back(ctrl);
} }
QMap<QString, QString> CCoreCtrl::IGetCamShowNames() QMap<QString, QString> CCoreCtrl::IGetCamShowNames()
@ -295,3 +313,34 @@ bool CCoreCtrl::onTaskFunc()
} }
return false; return false;
} }
void CCoreCtrl::onRunTask()
{
if (m_safeList.getSize() > 0) {
CameraCtrl ctrl;
m_safeList.pop_front(ctrl);
if (ctrl.m_ctrlType == 0)//开始相机 外触发
{
//onStartCamera(ctrl.strCamName);
}
else if (ctrl.m_ctrlType == 1)//停止相机
{
//onStopCamera(ctrl.strCamName);
}
else if (ctrl.m_ctrlType == 2)//开始相机 软触发
{
//onStartSoftCamera(ctrl.strCamName);
}
else if (ctrl.m_ctrlType == 3)//软触发一次相机
{
//onSoftTrigerCamera(ctrl.strCamName);
m_camDevManager->ISnapImage(QStringList()<<ctrl.strCamName);
}
else if (ctrl.m_ctrlType == 4)//开始相机 内触发相机
{
//onAutoTrigerCamera(ctrl.strCamName);
}
}
}
//void

@ -6,6 +6,14 @@
#include "QZkMutexMap.h" #include "QZkMutexMap.h"
#include "ImgProc.h" #include "ImgProc.h"
#include "CameraPool.h" #include "CameraPool.h"
#include "CThread.h"
#include "threadsafe_list.hpp"
typedef struct tagCameraCtrl
{
QString strCamName;
int m_ctrlType{ 0 };//0 start cam | 1 stop cam
}CameraCtrl;
class CCoreCtrl : public ICoreCtrl class CCoreCtrl : public ICoreCtrl
{ {
@ -61,6 +69,7 @@ private:
virtual bool IRegisterImageCallBack(FuncCallBack_StrImg callback); //获取相机图像回调接口 virtual bool IRegisterImageCallBack(FuncCallBack_StrImg callback); //获取相机图像回调接口
virtual bool IRegisterResultCallBack(FuncCallBack_StrMap callback); //获取算法结果回调接口 virtual bool IRegisterResultCallBack(FuncCallBack_StrMap callback); //获取算法结果回调接口
bool onTaskFunc(); bool onTaskFunc();
void onRunTask();
private: private:
QList<lpThread*> m_imgThdPool; QList<lpThread*> m_imgThdPool;
int m_nCoreCount; int m_nCoreCount;
@ -71,5 +80,8 @@ private:
CCameraPool* m_camDevManager{ nullptr }; CCameraPool* m_camDevManager{ nullptr };
IImgProc* m_gpImgProc{nullptr}; IImgProc* m_gpImgProc{nullptr};
class IDetectorEngine* m_pDE{ nullptr }; class IDetectorEngine* m_pDE{ nullptr };
CThread *m_pThread{nullptr};
//threadsafe_list
threadsafe_list<CameraCtrl> m_safeList;
}; };
#endif #endif

@ -5,7 +5,7 @@ lpThread::lpThread(QObject *parent) : QThread(parent)
} }
lpThread::lpThread(TaskFunc func, QObject *parent /*= nullptr*/): QThread(parent) lpThread::lpThread(TaskFunc_Bool func, QObject *parent /*= nullptr*/): QThread(parent)
{ {
_func = func; _func = func;
m_bIsRunning = false; m_bIsRunning = false;

@ -5,12 +5,12 @@
#include <QtCore/QThread> #include <QtCore/QThread>
#include <functional> #include <functional>
typedef std::function<bool(void)> TaskFunc; typedef std::function<bool(void)> TaskFunc_Bool;
class lpThread : public QThread class lpThread : public QThread
{ {
public: public:
lpThread(QObject *parent = nullptr); lpThread(QObject *parent = nullptr);
lpThread(TaskFunc func,QObject *parent = nullptr); lpThread(TaskFunc_Bool func,QObject *parent = nullptr);
~lpThread(); ~lpThread();
void StartThread(); void StartThread();
@ -23,7 +23,7 @@ private:
bool m_bRunSignal; bool m_bRunSignal;
bool m_bIsRunning; bool m_bIsRunning;
private: private:
TaskFunc _func; TaskFunc_Bool _func;
}; };
#endif // QTPTHREADBASE_H #endif // QTPTHREADBASE_H

@ -0,0 +1,81 @@
/*!
* \file threadsafe_list.hpp
* \date 2018/11/30
*
* \author pan yingdong
* Contact: bob.pan@hzleaper.com
*
*
* \note
*/
#ifndef _THREADSAFE_LIST_H_
#define _THREADSAFE_LIST_H_
#include <exception>
#include <memory>
#include <list>
#include <mutex>
#include <iostream>
struct empty_list :std::exception
{
const char* what() const throw(){ return "empty list"; };
};
template<typename T>
class threadsafe_list
{
private:
std::list<T> dataList;
mutable std::mutex m;
public:
threadsafe_list(){}
threadsafe_list(const threadsafe_list& other)
{
std::lock_guard<std::mutex> guard(m);
dataList = other.dataList;
}
threadsafe_list& operator=(const threadsafe_list&) = delete;
bool push_back(T new_val)
{
std::lock_guard<std::mutex> guard(m);
dataList.push_back(new_val);
return true;
}
std::shared_ptr<T> pop_front()
{
std::lock_guard<std::mutex> guard(m);
if (dataList.empty())
throw empty_list();
std::shared_ptr<T> const res(std::make_shared<T>(dataList.front()));
dataList.pop_front();
return res;
}
bool pop_front(T& value)
{
std::lock_guard<std::mutex> guard(m);
if (dataList.empty())
{
//throw empty_list();
return false;
}
value = dataList.front();
dataList.pop_front();
return true;
}
bool empty() const
{
std::lock_guard<std::mutex> guard(m);
return dataList.empty();
}
int getSize() const
{
std::lock_guard<std::mutex> guard(m);
return dataList.size();
}
void clear() {
std::lock_guard<std::mutex> guard(m);
dataList.clear();
}
};
#endif

@ -406,7 +406,18 @@ void gfunc_snap_camera_image(const QString& key, class ICameraObject*& pCam, voi
void CCameraPool::ISnapImage(const QStringList& camKeys) void CCameraPool::ISnapImage(const QStringList& camKeys)
{ {
m_CamDevMap.iterateCall2(gfunc_snap_camera_image, (void*)(&camKeys)); foreach(QString var, camKeys) {
QZkMutexMap<QString, class ICameraObject *>::iterator it = m_CamDevMap.find(var);
if (it != m_CamDevMap.end())
{
ICameraObject* pObj = *it;
if (pObj)
{
pObj->ISnapCamera();
}
}
}
// m_CamDevMap.iterateCall2(gfunc_snap_camera_image, (void*)(&camKeys));
} }
void gfunc_send_soft_trigger(const QString& key, class ICameraObject*& pCam, void* pData) void gfunc_send_soft_trigger(const QString& key, class ICameraObject*& pCam, void* pData)

@ -12,6 +12,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\src\lpCoreCtrl\CoreCtrl.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\CoreCtrl.cpp" />
<ClCompile Include="..\..\src\lpCoreCtrl\CThread.cpp" />
<ClCompile Include="..\..\src\lpCoreCtrl\ImageObject.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\ImageObject.cpp" />
<ClCompile Include="..\..\src\lpCoreCtrl\LoadModule.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\LoadModule.cpp" />
<ClCompile Include="..\..\src\lpCoreCtrl\lpThread.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\lpThread.cpp" />
@ -22,14 +23,31 @@
<ClCompile Include="..\..\src\lpCoreCtrl\tpImgProc\ImgProc.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\tpImgProc\ImgProc.cpp" />
<ClCompile Include="..\..\src\lpCoreCtrl\tpImgProc\LoadAlgorithm.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\tpImgProc\LoadAlgorithm.cpp" />
<ClCompile Include="..\..\src\lpCoreCtrl\lpCameraImage.cpp" /> <ClCompile Include="..\..\src\lpCoreCtrl\lpCameraImage.cpp" />
<ClCompile Include="GeneratedFiles\Debug\moc_CThread.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_CThread.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="lpCoreConfig.cpp" /> <ClCompile Include="lpCoreConfig.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\src\lpCoreCtrl\callbackFunc.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\callbackFunc.h" />
<ClInclude Include="..\..\src\lpCoreCtrl\CoreCtrl.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\CoreCtrl.h" />
<CustomBuild Include="..\..\src\lpCoreCtrl\CThread.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -D_UNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -DQT_SQL_LIB -DTPCORECTRL_LIB -DTPCORECTRL_EXPORTS -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtSerialPort" "-I$(QTDIR)\include\QtSql" "-I.\..\..\src\lpCoreCtrl" "-I.\..\..\src\lpCoreCtrl\tpCamera" "-I.\..\..\src\lpCoreCtrl\tpImgProc" "-I.\..\..\3part\libzkq\include" "-I.\..\..\3part\openssl\include" "-I.\..\..\3part\tadpole\include\tpBase"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -D_UNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -DQT_SQL_LIB -DTPCORECTRL_LIB -DTPCORECTRL_EXPORTS -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtSerialPort" "-I$(QTDIR)\include\QtSql" "-I.\..\..\src\lpCoreCtrl" "-I.\..\..\src\lpCoreCtrl\tpCamera" "-I.\..\..\src\lpCoreCtrl\tpImgProc" "-I.\..\..\3part\libzkq\include" "-I.\..\..\3part\openssl\include" "-I.\..\..\3part\tadpole\include\tpBase"</Command>
</CustomBuild>
<ClInclude Include="..\..\src\lpCoreCtrl\ImageObject.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\ImageObject.h" />
<ClInclude Include="..\..\src\lpCoreCtrl\LoadModule.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\LoadModule.h" />
<ClInclude Include="..\..\src\lpCoreCtrl\lpThread.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\lpThread.h" />
<ClInclude Include="..\..\src\lpCoreCtrl\threadsafe_list.hpp" />
<ClInclude Include="..\..\src\lpCoreCtrl\tpCamera\CameraPool.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\tpCamera\CameraPool.h" />
<ClInclude Include="..\..\src\lpCoreCtrl\tpCamera\lpCameraConfig.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\tpCamera\lpCameraConfig.h" />
<ClInclude Include="..\..\src\lpCoreCtrl\tpCamera\LibCameraes.h" /> <ClInclude Include="..\..\src\lpCoreCtrl\tpCamera\LibCameraes.h" />

@ -71,6 +71,15 @@
<ClCompile Include="..\..\src\lpCoreCtrl\lpThread.cpp"> <ClCompile Include="..\..\src\lpCoreCtrl\lpThread.cpp">
<Filter>tpCoreCtrl</Filter> <Filter>tpCoreCtrl</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\src\lpCoreCtrl\CThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_CThread.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_CThread.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\src\lpCoreCtrl\tpImgProc\ImgProc.h"> <ClInclude Include="..\..\src\lpCoreCtrl\tpImgProc\ImgProc.h">
@ -112,5 +121,13 @@
<ClInclude Include="..\..\src\lpCoreCtrl\lpThread.h"> <ClInclude Include="..\..\src\lpCoreCtrl\lpThread.h">
<Filter>tpCoreCtrl</Filter> <Filter>tpCoreCtrl</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\src\lpCoreCtrl\threadsafe_list.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="..\..\src\lpCoreCtrl\CThread.h">
<Filter>Header Files</Filter>
</CustomBuild>
</ItemGroup> </ItemGroup>
</Project> </Project>
Loading…
Cancel
Save