大家帮忙,我现在做了一个搜索歌曲在线播放的软件,播放软件用的active控件的media play,但是我发现我在线程里调用播放就不好用,如果我不用AfxBeginThread,而是直接用那个我自己封装的播放函数,就好使,怎么回事,请指点!

解决方案 »

  1.   

    不好用是什么意思?什么效果,COM库需要在每个线程里都要初始化,你有在线程里用
    CoInitialize()  CoUninitialize()
      

  2.   

    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)就播放不出来,为什么?
      

  3.   

    ThreadPlayMusic定义为全局函数,在用AfxBeginThread试试
      

  4.   

    ThreadPlayMusic定义全局的也不行呀
      

  5.   

    如果大家有兴趣,可以做一个测试一下,生成一个基于对话框的程序,然后插入active控件的
    media play,然后在线程里播放看看,能不能播放!
      

  6.   

    注意你的这个函数中的两句调用:
    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住所里存在的。
      

  7.   

    还补充一点,media play的active控件的线程模型是Apartment,也就是单线程的,不能在多线程中共享该com对象,如果实现要在多线程中共享该com对象,得进行特殊处理。