请教关于多线程的问题,多谢!!!

rabbit729 2007-09-04 10:26:44
我的程序是这样的:
想实现一个类似于播放器的功能,需要播放多个影片。我建立了一个对话框程序,上面有三个按钮:开始、暂停、停止。主线程负责接受消息,点击”开始“时起一个线程负责遍历歌曲(线程A)并调用第三方Dll来解析影片文件,为了保证图象和声音同步播放,在这个Dll中有分别起了两个线程用来解析图像(线程B)和声音(线程C)。这里我没有用用户线程和工作者线程而是用CreateThread()实现的。现在的问题时,在我点击”停止“按钮时我可以通过调用Dll中的Stop()接口来结束线程B和线程C,但该如何真正结束掉线程A,。还有这里的线程B和线程C是不是线程A的子线程,如果我强制把线程A结束了是不是线程B和线程C也就结束了。
可能我得想法根本就有问题,请大家多多指点!!!!!谢谢!!!!!
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrrrrrr 2007-09-12
  • 打赏
  • 举报
回复
我是菜鸟,想问问你的那个播放器是怎么实现的???/
怎样在点开始时播放两个文件
dyw 2007-09-05
  • 打赏
  • 举报
回复
A与B,C间没有关系;
线程B,C使用stop函数可安全退出,不用管;

需要给线程A增加退出机制:
——添加退出标记(使用全局变量或线程参数都可以),A检测到这个标记则执行退出代码。
——在“停止”按钮处理函数中设置这个标记,告诉A要退出了,然后WaitForSingleObject等待这个线程结束。
dyw 2007-09-05
  • 打赏
  • 举报
回复
你可能使用的是轮循的方式,那么改造
while(!m_bStop) // 把true改为!m_bStop
{
if(图像和声音解析完成)
break;
}
dyw 2007-09-05
  • 打赏
  • 举报
回复
if(图像和声音解析完成)
-----------
你这个是怎么判断出来的?
rabbit729 2007-09-05
  • 打赏
  • 举报
回复
线程A中的死循环造成的......
----------
改造死循环,
——如果线程B,C图像和声音解析完成时将退出,则可以等待线程B、C退出事件,方法还是调用WaitForSingleObject。由于之前已经调用了stop方法,线程B、C将很快退出,然后A也就很快退出了。

这个麻烦您给详细说一下行么?具体该添加到程序什么地方?还需要考虑正常播放时的情况。还有线程B,C的句柄得不到。
小弟刚接触多线程编程,还请多多指教!
dyw 2007-09-05
  • 打赏
  • 举报
回复
线程B、C的句柄是否能得到?
dyw 2007-09-05
  • 打赏
  • 举报
回复
"停止"按钮执行过程中disable开始按钮。

线程A中的死循环造成的......
----------
改造死循环,
——如果线程B,C图像和声音解析完成时将退出,则可以等待线程B、C退出事件,方法还是调用WaitForSingleObject。由于之前已经调用了stop方法,线程B、C将很快退出,然后A也就很快退出了。

——否则创建Event对象,等待Event事件的触发。这与那个DLL提供的接口有关。
rabbit729 2007-09-05
  • 打赏
  • 举报
回复
to dyw(道不同不相为谋):
------------

现在的问题是线程A中遍历影片的速度很快,而线程B和线程C解析文件的速度比较慢,所以需要在遍历下一个影片时等待前一个影片解析完成,类似代码如下:

void CSmsDlg::OnBtnStop()
{
// TODO: Add your control notification handler code here
m_bIsStop = true; //退出标记

if(m_hThread) // 线程A的句柄
{
m_dcpAnalyzer.playStop(); // 第三方接口
WaitForSingleObject(m_hThread, INFINITE);
CloseHandle(m_hThread);

m_hThread = NULL;
}
}

线程A的代码大致如下:
DWORD WINAPI CSmsDlg::ThreadFunc (LPVOID pParam)
{
for (int i = 0; i < 10; i++)
{
if(m_bIsStop )
break;
else
{
线程B; // 解析图像
线程C; // 解析声音

while(true)
{
if(图像和声音解析完成)
break;
}
}
}
return 0;
}

按照你的方法做,这样可以解决问题,但现在在点击完"停止"按钮后,程序有一短暂的挂起状态,这时点击"开始"按钮无响应,需要等一段时间即可响应,我觉得可能是线程A中的死循环造成的,可是又不知该如何等待前一个影片的结束?请指教!
dyw 2007-09-05
  • 打赏
  • 举报
回复
如果说线程A中只有一部影片就是说没有遍历的情况下
--------
遍历的过程中检查退出标记。只有一部影片那线程执行完就已经退出了,不用等待线程是否结束了。
A是否在运行能判断出来吧?
rabbit729 2007-09-05
  • 打赏
  • 举报
回复
to dyw(道不同不相为谋):
如果说线程A中只有一部影片就是说没有遍历的情况下,你的方法是不是就行不通了?多谢指点!
cnvb 2007-09-04
  • 打赏
  • 举报
回复
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

如果你结束A线程B线程和C线程应该不会结束吧...

15,471

社区成员

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

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