观察者模式
- 博客分类:
- 技术杂绘
观察者模式
2011年12月19日
class JPDecoder : public ISDD_Decoder
{
public:
JPDecoder();
virtual ~JPDecoder();
public:
//实现ISDD_Decoder接口
virtual bool Init();
virtual void Fini();
virtual void Release();
virtual void Reflesh();//刷新窗体
//流操作
virtual bool Open(void * argument, long size, long pool);
virtual void Close();
virtual bool InputData(void * buffer, unsigned long size, unsigned long type);
//控制
virtual bool StartPlay(HWND hwnd);
virtual bool StartPlay(HWND hwnd, PlaybackRecordCallback lpcbPlayback, char *pContext);
virtual void StopPlay();
virtual void Slow();
virtual void Fast();
virtual void Normal();
virtual void Pause();
virtual void Resume();
virtual void Jump(int post);
virtual void Snap(const char * pFilePath, PictureFormat ePictureFormat);
virtual int Vendor();
public:
//属性
void Vendor(int value); //设置厂商类型
void* GetFrameRatePara();//获取帧率回调参数
PlaybackRecordCallback m_pFrameProgress;//帧率回调
FrameRate* GetFrameStruct();
void SetFrameRateCallback(void *pPara);
static DWORD WINAPI GetTimeThread(void *pPara);
protected:
long m_jpNumber; //金鹏SDK函数里面的Number
HWND m_hPlayWnd; //播放窗口句柄
int m_vendor; //厂商类型
void *m_pContext;//设置帧率回调指针
FrameRate m_FrameRate;//帧率结构
friend class JPDecoderFactory;
};
DECLARE_DECODER_MODULE()
#endif
#include "jpdecoder.h"
#include "Ice_Entity.h"
#include
#include
// 金鹏DVRSDK头文件
#include "JPPlayApi.h"
/************************************************************************/
static std::vector *s_JPDecoderVec=NULL;//所有解码器对象
static bool s_bTimerRuning= false;//线程状态
static HANDLE s_hTimerThread= NULL;//时间线程
static DWORD s_dwThreadId= 0;//新线程Id
static CRITICAL_SECTION s_Section;//临界区对象
static BOOL s_bJPInit= FALSE; //是否已经初始化了
//金鹏SDK初始化操作
static BOOL JP_Init();
//金鹏SDK清理操作
static void JP_Fini();
//金鹏解码器创建操作
static ISDD_Decoder* JP_Create();
BEGIN_DECODER_MODULE()
DC_INIT(JP_Init)
DC_FINI(JP_Fini)
DC_CREATE(JP_Create)
END_DECODER_MODULE()
/************************************************************************/
static BOOL JP_Init()
{
s_bJPInit= TRUE;
s_bTimerRuning= true;
s_JPDecoderVec= new std::vector;
InitializeCriticalSection(&s_Section);
s_hTimerThread= CreateThread(NULL, 0, JPDecoder::GetTimeThread, NULL, 0, &s_dwThreadId);
return s_bJPInit;
}
static void JP_Fini()
{
//停止线程
s_bTimerRuning= false;
if(s_hTimerThread!=NULL)
{
WaitForSingleObject(s_hTimerThread, INFINITE);
CloseHandle(s_hTimerThread);
s_hTimerThread= NULL;
}
////浪费大量CPU时间
//while(true)
//{
// DWORD dwExitCode= STILL_ACTIVE;
// // 判断线程的退出代码前要求线程对象还没有退出
// ::GetExitCodeThread(s_hTimerThread, &dwExitCode);
// if( dwExitCode != STILL_ACTIVE)
// {
// break;
// }
//}
DeleteCriticalSection(&s_Section);
//释放对象
for( std::vector::iterator it=s_JPDecoderVec->begin(); it!= s_JPDecoderVec->end(); ++it)
{
JPDecoder *pDecoder= dynamic_cast(*it);
if( pDecoder!=NULL)
{
pDecoder->m_pFrameProgress= NULL;
delete pDecoder;
pDecoder= NULL;
}
}
s_JPDecoderVec->clear();
delete s_JPDecoderVec;
s_JPDecoderVec= NULL;
}
static ISDD_Decoder* JP_Create()
{
JPDecoder *newDecoder= NULL;
if (!s_bJPInit)
{
return NULL;
}
newDecoder= new JPDecoder;
newDecoder->Vendor(cameraType_JP);
s_JPDecoderVec->push_back(newDecoder);
return newDecoder;
}
/************************************************************************/
JPDecoder::JPDecoder()
: m_hPlayWnd(NULL),
m_jpNumber(-1),
m_pFrameProgress(NULL),
m_pContext(NULL)
{
memset(&m_FrameRate, 0, sizeof(m_FrameRate));
}
JPDecoder::~JPDecoder()
{
}
void* JPDecoder::GetFrameRatePara()
{
return m_pContext;
}
FrameRate* JPDecoder::GetFrameStruct()
{
return &m_FrameRate;
}
bool JPDecoder::Init()
{
BOOL bRet= FALSE;
bRet= Player_InitialDirectDraw();
return (TRUE==bRet ) ;
}
void JPDecoder::Fini()
{
Player_ReleaseDirectDraw();
}
int JPDecoder::Vendor()
{
return m_vendor;
}
void JPDecoder::Vendor(int value)
{
m_vendor= value;
}
bool JPDecoder::Open(void * argument, long size, long pool)
{
if (TRUE != Player_OpenStreamEx(m_jpNumber, STREAMFILEMODE, 0))
{
return false;
}
// if (TRUE != Player_SetStreamOpenMode(m_jpNumber, STREAMFILEMODE))
// {
// return false;
// }
return true;
}
void JPDecoder::Close()
{
Player_CloseStream(m_jpNumber);
}
void JPDecoder::Release()
{
/*
由于换成了全局对象,要在Fini中释放
delete this;
*/
}
bool JPDecoder::InputData(void * buffer, unsigned long size, unsigned long type)
{
BOOL bRet= FALSE;
bRet= Player_InputData(m_jpNumber, (PBYTE)buffer, size) ;
return (TRUE==bRet);
}
bool JPDecoder::StartPlay(HWND hwnd)
{
BOOL bRet= FALSE;
bRet= Player_Play(m_jpNumber, hwnd) ;
if (bRet)
{
m_hPlayWnd= hwnd;
}
else
{
m_hPlayWnd= NULL;
}
return (TRUE==bRet);
}
bool JPDecoder::StartPlay(HWND hwnd, PlaybackRecordCallback lpcbPlayback, char *pContext)
{
//设置回调函数和回调函数参数
m_pFrameProgress= lpcbPlayback;
m_pContext= pContext;
BOOL bRet= FALSE;
bRet= Player_Play(m_jpNumber, hwnd);
if (bRet)
{
m_hPlayWnd= hwnd;
}
else
{
m_hPlayWnd= NULL;
}
return (TRUE==bRet);
}
void JPDecoder::StopPlay()
{
Player_Stop(m_jpNumber);
}
void JPDecoder::Reflesh()
{
Player_Refresh(m_jpNumber);
}
void JPDecoder::Slow()
{
Player_Slow(m_jpNumber);
}
void JPDecoder::Fast()
{
Player_Fast(m_jpNumber);
}
void JPDecoder::Normal()
{
if (m_hPlayWnd != NULL)
{
Player_Play(m_jpNumber, m_hPlayWnd);
}
}
void JPDecoder::Pause()
{
Player_Pause(m_jpNumber);
}
void JPDecoder::Resume()
{
Player_Play(m_jpNumber, m_hPlayWnd);
}
void JPDecoder::Jump(int pos)
{
}
void JPDecoder::Snap(const char * pFilePath, PictureFormat ePictureFormat)
{
char szFileName[256]= {0};
int nImgType= (int)ePictureFormat;
if( PF_JPG==nImgType )
{
sprintf(szFileName, "%s", pFilePath);
}
else if( PF_BMP==nImgType )
{
sprintf(szFileName, "%s", pFilePath);
}
Player_SnapPicture(m_jpNumber, szFileName );
}
/************************************************************************/
DWORD WINAPI JPDecoder::GetTimeThread(void *pPara)
{
while(s_bTimerRuning)
{
EnterCriticalSection(&s_Section);
Sleep(500);
for( std::vector::iterator it=s_JPDecoderVec->begin(); it!= s_JPDecoderVec->end(); ++it)
{
JPDecoder *pDecoder= dynamic_cast(*it);
if( pDecoder!=NULL)
{
pDecoder->SetFrameRateCallback(pDecoder);
}
}
LeaveCriticalSection(&s_Section);
}
return 0;
}
void JPDecoder::SetFrameRateCallback(void *pPara)
{
JPDecoder *pDecoder= (JPDecoder*)(pPara) ;
if(pDecoder==NULL)
{
return;
}
long lNumber= pDecoder->m_jpNumber;
static unsigned long lRenderTime= Player_GetPlayedTime(lNumber);
unsigned long lTimeStamp= Player_GetPlayedTime(lNumber)-lRenderTime;
unsigned long lFrameRate= Player_GetPlayedFrames(lNumber);
/*
static long lCircleCount= 0;
CString str;
lCircleCount++;
str.AppendFormat(L"%ld",ulFrameRate);
if( 0==(lCircleCount%20) )
OutputDebugString(str+ LPCTSTR("\n"));
else
OutputDebugString(str+ LPCTSTR(";"));
*/
if ( pDecoder->m_pFrameProgress!=NULL )
{
pDecoder->m_pFrameProgress( (char*)pDecoder->GetFrameRatePara(), lFrameRate ,lTimeStamp);
}
}
发表评论
-
JS/VBS配合Adodb.Stream处理字节数据/输出二进制文件
2012-01-20 02:13 1334JS/VBS配合Adodb.Stream处理 ... -
用Wscript的Arguments属性实现vbs的命令行参数形式启动
2012-01-20 02:13 1237用Wscript的Arguments属性实现vbs的命令行参数 ... -
VBS--自动定时截图工具
2012-01-20 02:13 1088VBS--自动定时截图工具 2010年09月01日 一、 ... -
使用 Iisftp.vbs 创建 FTP 站点
2012-01-20 02:13 674使用 Iisftp.vbs 创建 FTP ... -
CuteFTP上传脚本(VBS)
2012-01-20 02:13 643CuteFTP上传脚本(VBS) 2010年08月13日 ... -
Service程序
2012-01-19 10:03 478Service程序 2010年12月13日 用ATL非常 ... -
调用规范与可变参数表
2012-01-19 10:03 581调用规范与可变参数表 ... -
编程基本
2012-01-19 10:03 471编程基本 2011年09月03日 繁 -
12.29遛狗日记
2012-01-19 10:03 69512.29遛狗日记 2011年12月30日 01.18 ... -
如何导出wince6.0的SDK 添加MFC支持
2012-01-17 02:44 694如何导出wince6.0的SDK 添加MFC支持 2010年 ... -
Windows下NDK开发环境的搭建(Cygwin+Android-SDK+NDK)
2012-01-17 02:44 514Windows下NDK开发环境的搭 ... -
SDK详解
2012-01-17 02:44 562SDK详解 2010年11月01日 sdk SDK( ... -
sdk
2012-01-17 02:44 662sdk 2011年05月19日 SD ... -
微软计划今春推Kinect Windows SDK开发工具
2012-01-17 02:44 518微软计划今春推Kinect Windows SDK开发工具 ... -
RIA
2012-01-15 22:20 571RIA 2010年04月12日 Ja ... -
Java和flash通信中数据的zlib压缩与解压缩
2012-01-15 22:20 827Java和flash通信中数据的zlib压缩与解压缩 200 ... -
ArcGIS Server for Flex 资源收集
2012-01-15 22:20 542ArcGIS Server for Flex 资源 ... -
TWaver Flex会给电信软件开发带来变革吗?
2012-01-15 22:20 641TWaver Flex会给电信软件开发带来变革吗? 2010 ... -
天地会flash资源导航
2012-01-15 22:20 2023天地会flash资源导航 2011年02月25日 一 f ...
相关推荐
Qt设计模式之观察者模式
采用Java语言编写的一个观察者模式实例。观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,...
java观察者模式观察者模式java观察者模式观察者模式java观察者模式观察者模式
观察者模式及实例,适合初学者阅读 。。。。。。。。。。。。。。。
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
观察者模式
java 设计模式 观察者模式 简单实例 包括测试test类
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
设计模式之观察者模式Java版本实现和UML类设计图
设计模式-观察者模式(讲解及其实现代码)
设计模式--观察者模式java例子
运用观察者模式及MVC模式的整合,是javaWeb的简单的实现了选民投票
观察者模式Demo,设计模式,观察者模式
观察者模式使用
iOS 设计模式 观察者模式
观察者模式小型框架
56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1
面向对象23种设计模式之观察者模式,简单明了。面向对象23种设计模式之观察者模式,简单明了。