华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);
  }
 }
}

 

 

 


posted @ 2010-06-23 11:12  流水不腐-户枢不蠹  阅读(232)  评论(0)    收藏  举报