为什么media play的active控件在线程里播放不好用,而不在线程里就好用呢? 大家帮忙,我现在做了一个搜索歌曲在线播放的软件,播放软件用的active控件的media play,但是我发现我在线程里调用播放就不好用,如果我不用AfxBeginThread,而是直接用那个我自己封装的播放函数,就好使,怎么回事,请指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不好用是什么意思?什么效果,COM库需要在每个线程里都要初始化,你有在线程里用CoInitialize() CoUninitialize() void CPlayMusicDlg::PlayMusic(char *pszUrl){ m_mediaPlay.GetControls().stop(); m_mediaPlay.SetUrl(pszUrl); m_mediaPlay.GetControls().play();}UINT CSearchMusicDlg::ThreadPlayMusic(LPVOID lp){ CoInitialize(NULL); ((CSearchMusicDlg *)((CSearchMusicApp *)AfxGetApp())->m_pMainWnd)->m_PlayDlg.PlayMusic("http://wma1.23tg.com/musicm22-jy168net/00380/0026.wma"); CoUninitialize(); return 0;}如果我直接调ThreadPlayMusic(LPVOID lp)歌曲就能播放出来,如果我用AfxBeginThread(TreadPlayMusic,NULL)就播放不出来,为什么? ThreadPlayMusic定义为全局函数,在用AfxBeginThread试试 ThreadPlayMusic定义全局的也不行呀 如果大家有兴趣,可以做一个测试一下,生成一个基于对话框的程序,然后插入active控件的media play,然后在线程里播放看看,能不能播放! 注意你的这个函数中的两句调用:UINT CSearchMusicDlg::ThreadPlayMusic(LPVOID lp){ CoInitialize(NULL);//第一句调用 ((CSearchMusicDlg *)((CSearchMusicApp *)AfxGetApp())->m_pMainWnd)->m_PlayDlg.PlayMusic("http://wma1.23tg.com/musicm22-jy168net/00380/0026.wma"); CoUninitialize();//第二句调用 return 0;}在上面两句之间的函数调用是立即返回的,也就是说只要执行你的这个函数,上面注明的第一句调用与第二句调用很快完成,这个函数执行完,线程中的com住所也不存在了,当然就不能执行了。为什么在主线程中直接调用这个函数成功呢,因为主线程启动了一个com住所,这个com住所要在退出主线程时才会调用CoUninitialize()函数,这时你无论调不调用CoInitialize(NULL);//第一句调用都能放你的意乐,如果调用了则再建一个com住所,而放音乐的com对象是在主线程的com住所里存在的。 还补充一点,media play的active控件的线程模型是Apartment,也就是单线程的,不能在多线程中共享该com对象,如果实现要在多线程中共享该com对象,得进行特殊处理。 基于对话框的两个按钮类中LButtonDown和其它的消息响应为什么不一样??? ADODC 与DATAGRID引起的问题 MFC 串口通信 发送多个变量 通信协议 跪求音频采集代码 关于静态变量的问题~~~ 找工作,散分!这种水平找得到吗 VC+ADO连接本地数据库失败,为什么? 请问如何屏蔽键盘上的屏幕拷贝键(Print Screen Sys Rq) 如何动态创建数据表 MFC实现弹出移动硬盘 调试动态dll问题,郁闷中 关于程序的自我删除
CoInitialize() CoUninitialize()
{ m_mediaPlay.GetControls().stop();
m_mediaPlay.SetUrl(pszUrl);
m_mediaPlay.GetControls().play();
}
UINT CSearchMusicDlg::ThreadPlayMusic(LPVOID lp)
{
CoInitialize(NULL);
((CSearchMusicDlg *)((CSearchMusicApp *)AfxGetApp())->m_pMainWnd)->m_PlayDlg.PlayMusic("http://wma1.23tg.com/musicm22-jy168net/00380/0026.wma");
CoUninitialize();
return 0;
}如果我直接调ThreadPlayMusic(LPVOID lp)歌曲就能播放出来,如果我用AfxBeginThread(TreadPlayMusic,NULL)就播放不出来,为什么?
media play,然后在线程里播放看看,能不能播放!
UINT CSearchMusicDlg::ThreadPlayMusic(LPVOID lp)
{
CoInitialize(NULL);//第一句调用
((CSearchMusicDlg *)((CSearchMusicApp *)AfxGetApp())->m_pMainWnd)->m_PlayDlg.PlayMusic("http://wma1.23tg.com/musicm22-jy168net/00380/0026.wma");
CoUninitialize();//第二句调用
return 0;
}在上面两句之间的函数调用是立即返回的,也就是说只要执行你的这个函数,上面注明的第一句调用与第二句调用很快完成,这个函数执行完,线程中的com住所也不存在了,当然就不能执行了。
为什么在主线程中直接调用这个函数成功呢,因为主线程启动了一个com住所,这个com住所要在退出主线程时才会调用CoUninitialize()函数,这时你无论调不调用CoInitialize(NULL);//第一句调用
都能放你的意乐,如果调用了则再建一个com住所,而放音乐的com对象是在主线程的com住所里存在的。