大华相机中的一个模板嵌套

CSingleDisplayDlg::CSingleDisplayDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSingleDisplayDlg::IDD, pParent)
	, _connected(false)
	, _isGrabbing(false)
	, _bRunning(false)
	, _frameCnt(0)
	, _frameCtrl(false)
	, _maxFrameCnt(0)
	, _devListDlg(NULL)
	, _displayThread(CThreadLite::ThreadProc(&CSingleDisplayDlg::DisplayThreadProc, this), "Display")
//	, _streamRetrieveThread(CThreadLite::ThreadProc(&CSingleDisplayDlg::StreamRetrieveThreadPro, this), "StreamRetrieve")
	, m_dDisplayInterval(0)
	, m_nFirstFrameTime(0)
	, m_nLastFrameTime(0)
	, m_strPortNum(_T(""))
	, m_strEditReceive(_T(""))
	, m_editCCD_Receive(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	valMin = 0;
	frmCnt = 0;
	strFilePath = "";
	//setDisplayFPS(100);   // 默认显示30帧
}

上面的初始化列表中有:

_displayThread(CThreadLite::ThreadProc(&CSingleDisplayDlg::DisplayThreadProc, this), "Display")

DisplayThreadProc函数定义如下

// 显示线程
void CSingleDisplayDlg::DisplayThreadProc(Dahua::Infra::CThreadLite& lite)
{
	while ( lite.looping() )
	{
		
		if(!_bRunning)
		{
			Sleep(10);
			continue;
		}

		if(m_bStopGrabbing)
		{
			StopStreamGrabbing();
		}
		
		FrameBufferSPtr	displayFrame = getConvertedImage();
		
		if (!displayFrame )
		{
			continue;
		}

		_render.display(displayFrame->bufPtr(), displayFrame->Width(), displayFrame->Height(), displayFrame->PixelFormat());
	}
}

下面深入展开_displayThread(CThreadLite::ThreadProc(&CSingleDisplayDlg::DisplayThreadProc, this), "Display")

_displayThread的定义:

Dahua::Infra::CThreadLite           _displayThread;   // 显示线程

CThreadLite是一个继承自CThread的线程类

class INFRA_API CThreadLite : public CThread
{
	CThreadLite(CThreadLite const&);
	CThreadLite& operator=(CThreadLite const&);

public:
	/// 线程执行体, 参数为线程对象的引用
	typedef TFunction1<void, CThreadLite&> ThreadProc;

	/// 构造函数,并没有创建系统线程
	/// \param proc 线程体函数
	/// \param name 线程名称字符串,名称不一定会传给操作系统,但CThreadManager
	///		   管理线程时会用到。
	/// \param priority 线程优先级,值越小表示优先级越高,会被转化成对应操作系统
	///        平台的优先级。取值priorTop到priorBottom,默认值priorDefault。
	/// \param policy 线程调度策略
	/// \param stackSize 为线程指定的堆栈大小,如果等于0或者小于平台要求必须的值,
	///        则使用平台缺省值。
	CThreadLite(ThreadProc proc, const char* name, int priority = priorDefault, int policy = policyNormal, int stackSize = 0);

	/// 析构函数,如果线程还在执行,会销毁线程
	virtual ~CThreadLite();

private:
	/// 线程执行体
	virtual void threadProc();

	ThreadLiteInternal	*m_internal;
};

ThreadProc是一个类模板,第一个参数类型为void,第二个参数类型为CThreadLite&

//TFuction1
#define FUNCTION_NUMBER 1
#define FUNCTION_CLASS_TYPES typename R, typename T1
#define FUNCTION_TYPES T1
#define FUNCTION_TYPE_ARGS T1 a1
#define FUNCTION_ARGS a1
#include "FunctionTemplate.h"
#undef  FUNCTION_NUMBER
#undef  FUNCTION_CLASS_TYPES
#undef    FUNCTION_TYPES
#undef    FUNCTION_TYPE_ARGS
#undef    FUNCTION_ARGS

template <FUNCTION_CLASS_TYPES>
class FUNCTION_FUNCTION
{
	class X{};
	
	typedef R (X::*MEM_FUNCTION)(FUNCTION_TYPES);
	
	typedef R (*GEN_FUNCTION)(FUNCTION_TYPES);
	
	
	enum {
		MEMBER_SHAREDPTR_FUNC,
		MEMBER_OBJ_FUNC,
		GEN_FUNC,
		INVALID_FUNC
	};
	
	int m_type;
	
	union {
		MEM_FUNCTION memberFunc;
		GEN_FUNCTION genFunc;
	}m_f;
	X*                      m_obj;
	Memory::TSharedPtr< X > m_sptr;
	
public:
	
	/// 缺省构造函数
	FUNCTION_FUNCTION()
		: m_type(INVALID_FUNC)
		, m_obj(NULL)
	{
		m_f.memberFunc = NULL;
		m_f.genFunc	= NULL;
	}

	template< class T >
	FUNCTION_FUNCTION( R(T::*f)(FUNCTION_TYPES), Memory::TSharedPtr< T > const& object )
		: m_type(MEMBER_SHAREDPTR_FUNC)
		, m_obj(NULL)
		, m_sptr(object, Detail::horrible_cast<X*, T*>(object.get()))
	{
		m_f.memberFunc = Detail::horrible_cast<MEM_FUNCTION>(f);
	}

	
	template< class T >
	FUNCTION_FUNCTION( R(T::*f)(FUNCTION_TYPES), T* object )
		: m_type(MEMBER_OBJ_FUNC)
		, m_obj( Detail::horrible_cast<X*, T*>(object) )
	{
		m_f.memberFunc = Detail::horrible_cast<MEM_FUNCTION>(f);
	}
...
}

因此上面的模板类变为

R==>void    T1==>CThreadLite&
template <typename R, typename T1>
class TFunction1
{
	class X{};
	
	typedef void (X::*MEM_FUNCTION)(T1);
	
	typedef void (*GEN_FUNCTION)(T1);
	
	
	enum {
		MEMBER_SHAREDPTR_FUNC,
		MEMBER_OBJ_FUNC,
		GEN_FUNC,
		INVALID_FUNC
	};
	
	int m_type;
	
	union {
		MEM_FUNCTION memberFunc;
		GEN_FUNCTION genFunc;
	}m_f;
	X*                      m_obj;
	Memory::TSharedPtr< X > m_sptr;
	
public:
	
	/// 缺省构造函数
	TFunction1()
		: m_type(INVALID_FUNC)
		, m_obj(NULL)
	{
		m_f.memberFunc = NULL;
		m_f.genFunc	= NULL;
	}

	template< class T >
	TFunction1( R(T::*f)(T1), Memory::TSharedPtr< T > const& object )
		: m_type(MEMBER_SHAREDPTR_FUNC)
		, m_obj(NULL)
		, m_sptr(object, Detail::horrible_cast<X*, T*>(object.get()))
	{
		m_f.memberFunc = Detail::horrible_cast<MEM_FUNCTION>(f);
	}
...
}

CThreadLite::ThreadProc(&CSingleDisplayDlg::DisplayThreadProc, this)会调用构造函数

template< class T >
	FUNCTION_FUNCTION( R(T::*f)(FUNCTION_TYPES), T* object )
		: m_type(MEMBER_OBJ_FUNC)
		, m_obj( Detail::horrible_cast<X*, T*>(object) )
	{
		m_f.memberFunc = Detail::horrible_cast<MEM_FUNCTION>(f);
	}

默认推导T为CSingleDisplayDlg类,FUNCTION_TYPES为T1,即CThreadLite&,这是一个线程指向线程的引用,指向显示线程函数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值