我在子线程里用PlaySound播放wav,  我在主线程终止了那个线程,再次创建那个子线程播放WAV,没有声音了,怎么回事?

解决方案 »

  1.   

    问两个问题
    1 你是怎样结束掉线程的
    2 你调用playsound的方法怎样的?
      

  2.   

    干掉线程:
    if(!GetExitCodeThread(m_ExitThreadeventComPlay,&code)||(code == STILL_ACTIVE))
    {
    TerminateThread(m_ExitThreadeventComPlay,0);
    CloseHandle(m_ExitThreadeventComPlay);
    }
    线程函数
    DWORD WINAPI  CWTV020SV3Dlg::ComPlay(LPVOID lparam)
    {
    CWTV020SV3Dlg *wtvDlg = (CWTV020SV3Dlg *)lparam;        if(wtvDlg == NULL)
            {
                return 0;
            } vector<PlayNode*> *pPlayList = &wtvDlg->PlayList;        if(pPlayList == NULL)
            {
                return 0;
            } int ComListSize = pPlayList->size(); for (int i=0; i<ComListSize; i++)
    { if ((*pPlayList)[i]->Sign == 1)
    {
    Sleep((*pPlayList)[i]->m_MuteData * 10);
    }
    else
    {
    CString path = (*pPlayList)[i]->m_VoiceFileName;  //取得文件路径
    path = wtvDlg->CSMainAudioSource + "\\" + path +".wav"; if (!path.IsEmpty())
    {
    PlaySound(path, NULL, SND_FILENAME|SND_SYNC); }

    }  } return 0;
    }
      

  3.   

    用TerminateThread干掉线程不安全,最好不用这个,再试一下
      

  4.   

    最好让线程自己结束,可以定义一个标志位来实现。在线程的每次循环中检查这个标志位,如果发现这个标志位为某个值,就直接return,这样线程就自己结束了。但我不知道这样是否符合你的要求
      

  5.   

    PlaySound(path, NULL, SND_FILENAME|SND_SYNC);     
    我需要的是同步播放假如一首歌3分钟    在这首歌播放之后,我设置了值退出线程的标志,那不是要等<3分钟?
      

  6.   

    如果是同步播放的话,那确实是这样。试想如果在播放的时候,线程突然被干掉了,我想是不是会出现一些问题?我想问一下,你用你原来的方法的时候,第二次创建线程的时候,你能确保代码调用了playsound函数但不能播放wav文件了吗?
      

  7.   

    调试了一下, 确实进入到这个函数....
      可能关闭线程而没有关闭PlaySound函数正在播放的语音造成的?
      

  8.   

    这个函数 这个函数指  PlaySound
      

  9.   

    我也遇到了这个问题,如果在重新调用playsound函数之前中断一下,再继续运行就没问题。但如果一直运行,就会没有声音。我是用的PlaySound(0,0,SND_PURGE)停止播放的。