多线程播放视频的问题

hbzxlin 2005-10-31 11:29:07
部分代码如下:

static BOOL bVideoPlay = FALSE;
HANDLE hMutex = CreateMutex(NULL,FALSE,NULL);

UINT MyVideoThread(LPVOID pParam)
{
WaitForSingleObject(hMutex,INFINITE);
CFuDlg *dlg = (CFubuDlg*)pParam;
CString strTmp=dlg->m_strFileName;
dlg->m_Video.Open(strTmp,dlg,312,165);
dlg->m_Video.Play(0);
while(bVideoPlay)
Sleep(1);
dlg->m_Video.Stop();
dlg->m_Video.Close();
ReleaseMutex(hMutex);
return 0;
}

void CFuDlg::HandlePage()
{
bVideoPlay = FALSE;

WaitForSingleObject(hMutex,INFINITE);
pVideoThread = AfxBeginThread(MyVideoThread, this);
bVideoPlay = TRUE;
ReleaseMutex(hMutex);
}

void CFuDlg::m_PlayVideo(CString filename)
{
m_strFileName = filename;
HandlePage();
}

问题:第一个视频播放正常,第二个播放的时候出现死机,请大家支持,谢谢!
...全文
255 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbzxlin 2005-10-31
  • 打赏
  • 举报
回复
我这么做的目的是希望在每次更换播放不同视频文件的时候不出现窗口的闪动,现在解决了这个问题,但是每次第二个视频文件播放的开始会先播放一点乱七八糟的东西,郁闷!
hbzxlin 2005-10-31
  • 打赏
  • 举报
回复
while(bVideoPlay)
Sleep(1);
去掉??
去掉后不直接就关闭了么?
goodboyws 2005-10-31
  • 打赏
  • 举报
回复
可以,因为只有第一个线程停止,第二个线程才会启动
UINT MyVideoThread(LPVOID pParam)
{
WaitForSingleObject(hMutex,INFINITE);
......
你的做法实际上是在播放时阻塞了主线程
goodboyws 2005-10-31
  • 打赏
  • 举报
回复

while(bVideoPlay)
Sleep(1);
去掉
hbzxlin 2005-10-31
  • 打赏
  • 举报
回复
to goodboyws,您说的去掉那两条当然可以解决死锁的问题,但是这样不能保证在播放第二个视频文件的时候关闭第一个吧?!
hbzxlin 2005-10-31
  • 打赏
  • 举报
回复
楼上所言极是,我的目的是在播放第二个的时候停止播放第一个,所以在线程MyVideoThread中判断bVideoPlay的值,在第二次调用HandlePage的时候首先设置bVideoPlay 为 FALSE,于是MyVideoThread线程应该结束,结束后将播放第二个不同的视频文件!现在就是在第二次调用HandlePage的时候出现死机,谢谢大家,请继续支持!
GoogleGeek 2005-10-31
  • 打赏
  • 举报
回复
你播放第二个的时候,第一个播放完了吗?
按照你的写法,只有第一个播放完了,才能播放第2个
goodboyws 2005-10-31
  • 打赏
  • 举报
回复
去掉
HandlePage里的WaitForSingleObject(hMutex,INFINITE);和 ReleaseMutex(hMutex);
goodboyws 2005-10-31
  • 打赏
  • 举报
回复
WaitForSingleObject(hMutex,INFINITE);不该在两个地方都加,有可能造成死锁

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧