大概情况如下:
主程序播放一个MP3文件,而播放用一个线程实现,当这个线程退出前,向父窗口发送一个消息,表示音乐播放完毕。但是在父窗口里,不响应这个消息,调试了半天不知道是为何,发上来请高人指点:
//父窗口的构造函数里 CMusicPlayer是我自己定义的一个类,用DirectShow来播放MP3的
m_pMusicPlayer = new CMusicPlayer(this->m_hWnd);
m_pMusicPlayer->InitPlayer();
//父窗口播放按钮事件
m_pMusicPlayer->LoadFile(m_SelFile);  //m_SelFile是父窗口类的成员变量
m_pMusicPlayer->Play();
//父窗口消息映射
ON_MESSAGE(WM_MPCOMPLETE,OnMPComplete) //WM_MPCOMPLETE是自定义消息 WM_USER+102
//消息响应函数
LRESULT CTest::OnMPComplete(WPARAM wParam, LPARAM lParam)
{
if (wParam == WM_MPCOMPLETE)
{
            AfxMessageBox(L"播放结束");
}
return 1;
}//CMusicPlayer::Play()函数实现
BOOL CMusicPlayer::Play()
{
HRESULT hr = m_pControl->Run();
if (FAILED(hr))
    {
        MessageBox(NULL, L"播放音频失败。", L"错误", MB_OK);
        return FALSE;
    }
if (m_pPlay2EndThread == NULL)
{
m_pPlay2EndThread = AfxBeginThread(AFX_THREADPROC(Play2End), (LPVOID)this);
m_pPlay2EndThread->m_bAutoDelete = TRUE;
}
return TRUE;
}//线程Play2End实现函数
UINT CMusicPlayer::Play2End(LPVOID pParam)
{
CMusicPlayer *pMP = (CMusicPlayer *)pParam;
HANDLE hEvent;
HRESULT hr = S_OK;
hr = pMP->m_pEvent->GetEventHandle((OAEVENT*)&hEvent);
if (FAILED(hr))
{
pMP->m_bPlay2End = TRUE;
return 0;
}
BOOL bDone = FALSE;
LONG evCode, evParaml, evParam2;
evCode = 0;
evParaml = 0;
evParam2 = 0;
while (!bDone) //while 1
{
if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 100))
{
while (SUCCEEDED(pMP->m_pEvent->GetEvent(&evCode,
&evParaml, &evParam2, 0)))
{
pMP->m_pEvent->FreeEventParams(evCode,
evParaml, evParam2);
LONGLONG llCurrent, llStop;
llCurrent = ONE_SECOND;
llStop = ONE_SECOND - ONE_SECOND;
switch(evCode)
{
case EC_COMPLETE:
pMP->Stop();
PostMessage(pMP->m_hWnd, WM_MPCOMPLETE, 0, 0);
pMP->m_bPlay2End = TRUE;
return 1;
default:
break;
} //end switch
//获得消息后,释放参数
} //end while 2
} //end if
} //end while 1
pMP->m_bPlay2End = TRUE;
return 1;
}烦请高人给看看问题出在哪里了?

解决方案 »

  1.   

    PostMessage(pMP->m_hWnd, WM_MPCOMPLETE, 0, 0);LRESULT CTest::OnMPComplete(WPARAM wParam, LPARAM lParam)
    {
    if (wParam == WM_MPCOMPLETE)
    {
      AfxMessageBox(L"播放结束");
    }
    return 1;
    }看看吧,OnMPComplete本来就是响应WM_MPCOMPLETE消息的事件,为啥还要判断if (wParam == WM_MPCOMPLETE)呢?根据你发送消息的代码,这里wParam值是0。
    改为:
    LRESULT CTest::OnMPComplete(WPARAM wParam, LPARAM lParam)
    {  AfxMessageBox(L"播放结束");return 1;
    }
    就行啦
      

  2.   

    直接在OnMPComplete函数中处理,不需要额外判断了
      

  3.   


    呵呵,可能是我习惯了,多谢建议,我改过来。但是我把断点下在“if (wParam == WM_MPCOMPLETE)” 程序压根就没有走到这里
      

  4.   

    我把“if (wParam == WM_MPCOMPLETE)”去掉了 程序也没有相应这个消息,下断点也没有走到这里AfxMessageBox(L"播放结束"); 奇怪了
      

  5.   

    没人知道吗?我用了AfxGetMainWnd()->PostMessage(WM_MPCOMPLETE);也不行
      

  6.   

    你确定m_pControl->Run();调用返回了?
    或许这个函数一直没有回,新的线程也没有启动。