专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

DirectDraw多线程使用的诸多有关问题,请问DDraw高手

发布时间:2011-06-27 19:20:53 文章来源:www.iduyao.cn 采编人员:星星草
DirectDraw多线程使用的诸多问题,请教DDraw高手
我用DirectDraw来播放电影,对解码器解出的BMP图象序列写屏。
我建立了一个类,它做如下的事情:
1、初始化函数
      (1)创建一个准备用于播放的窗口,它后来要么附着到主窗口内,要么作为一个
            分离窗口。
      (2)创建一个默认32位的主表面,并Clipper到上面的播放窗口,再创建一个离屏
            表面,离屏表面将依据解码器输出的BMP宽、高和位数动态创建。
      m_hPlayWnd   =   CreateWindow(   s_szWndName,   _T( " "),  
            WS_OVERLAPPEDWINDOW|WS_POPUP|WS_SIZEBOX,
            0,   0,   320,   240,   NULL,   NULL,   GetModuleHandle(   NULL   ),   0   );
      DDSURFACEDESC2   ddsd;
      if(   FAILED(   DirectDrawCreateEx(   NULL,   (VOID**)&m_lpDDraw,  
            IID_IDirectDraw7,   NULL   )   )   || FAILED(m_lpDDraw-> SetCooperativeLevel
            (   NULL,   DDSCL_NORMAL   ))   )
            return   FALSE;
      memset(   &ddsd,   0,   sizeof(ddsd)   );
      ddsd.dwSize     =   sizeof(ddsd);
      ddsd.dwFlags   =   DDSD_CAPS;
      ddsd.ddsCaps.dwCaps   =   DDSCAPS_PRIMARYSURFACE   |   DDSCAPS_VIDEOMEMORY;
      if(   FAILED(m_lpDDraw-> CreateSurface(   &ddsd,   &m_lpddsPrimary,   NULL   ))   )
            return   FALSE;
      m_lpDDraw-> CreateClipper(   0,   &m_lpddClipper,   NULL   );
      m_lpddClipper-> SetHWnd(   0,   m_hPlayWnd   );
      m_lpddsPrimary-> SetClipper(   m_lpddClipper   );

      memset(   &ddsd,   0,   sizeof(ddsd)   );
      ddsd.dwSize   =   sizeof(ddsd);
      ddsd.dwFlags   =   DDSD_CAPS   |   DDSD_HEIGHT   |   DDSD_WIDTH;
      ddsd.ddsCaps.dwCaps   =   DDSCAPS_OFFSCREENPLAIN   |   DDSCAPS_SYSTEMMEMORY;  
      ddsd.dwWidth     =   m_nWidth;
      ddsd.dwHeight   =   m_nHeight;
      m_lpDDraw-> CreateSurface(   &ddsd,   &m_lpddsBack,   NULL   );
2、播放BMP函数
      先对离屏表面GetDC(),然后把BMP数据StretchBlt到离屏表面。
      最后调用主表面的Blt,显示离屏表面内的BMP图象。
      HDC   hDC;
      ddrval   =   m_lpddsBack-> GetDC(   &hDC   );
      SetDIBitsToDevice(   hDC,   0,   0,   m_nWidth,   m_nHeight,   0,   0,   0,   m_nHeight,
            m_pPicBuff,   (LPBITMAPINFO)&m_biInfo,   DIB_RGB_COLORS   );
      m_lpddsBack-> ReleaseDC(   hDC   );
      ddrval   =   m_lpddsPrimary-> Blt(   &dstRect,   m_lpddsBack,   &srcRect,  
            DDBLT_ASYNC,   NULL   );

问题之一:
      解码器线程,和创建DDraw的线程,以及播放窗口不在同一个线程,也不可能在同
      一个线程。这就造成了播放窗口在拖动时,整个屏幕都不停的闪烁。

      试着将创建DDraw和播放窗口放入主线程,解码线程通过PostMessage往播放窗口
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: