华3 OAA平台客户端流播放模式 解码堵塞
流数据播放业务时,初始化,打开流,播放流都很正常,但是当关闭播放时,最后一个数据包解码不返回,导致死锁。
解码是在一个线程里运行的,而且视频窗口用movewindow缩放时,有时也会导致解码堵塞。
软件环境:
SDK:iVS8000系统SDK(COM)E1220P25
Svl_COMObject.dll库版本:2.0.19.0
StreamDC.ocx版本:1.0.0.1
开发:VS2008 C++
代码如下:
初始化:正常
struct _GUID tian = __uuidof(SvlClass);
m_pSvlCom = SvlInterfacePtr(tian);
if(NULL == m_pSvlCom)
{
return FALSE;
}
int initExitCode = m_pSvlCom->InitSdk();
打开流:正常
m_pSvlCom->H3C_SetPlayWindow((int)hWnd, iclient);
ULONG nRet = m_pSvlCom->H3C_OpenStream(iclient, 1500*520);
播放流:正常
ULONG nRet = m_pSvlCom->H3C_InputData(iclent, (long)pbuf, ilen);
程序退出或视频窗口缩放时,最后一个数据包解码不返回(H3C_InputData堵塞)
********************************************************
研究了两天,终于解决了
com库消息堵塞了,线程退出是不能用事件消息同步的。
必须用PeekMessage 对线程消息处理。
具体解决如下:
1、增加线程退出标识mbExit,线程启动时为FALSE,线程退出时为TRUE
2、退出时判断mbExit是否为TRUE,如果为FALSE,循环调用DoEvents。
void DoEvents(int nCount) //nCount:doevent 多少次
{
MSG msg;
for(int i=0;i<nCount;i++)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}

浙公网安备 33010602011771号