大家好,我把MCI设备打开MID文件,放在一个线程中。程序运行后,点击播放没有反应。我想加入背景音乐。如果放在主线程中执行,程序可以播放MID文件。代码如下:
打开Mid文件:
void CFiveDlg::MciOpen()
{
MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_SEQUENCER;//MIDI类型
OpenParms.lpstrElementName="E:\\五子棋\\开心五子棋\\res\\bk.MID";
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,   
(DWORD)(LPVOID)&OpenParms);  
m_wDeviceID=OpenParms.wDeviceID;
}
放在主线程OnInitDialog()中,运行正常。
放在一线程中代码如下:
BOOL CFiveDlg::OnInitDialog()
{
       ....
       g_MciOpen=CreateThread(NULL,0,ThreadProc,this,0,NULL);
       CloseHandle(g_MciOpen);
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    CFiveDlg *pFiveDlg=(CFiveDlg*)lpParameter;
    pFiveDlg->MciOpen();
    return 0;
}
断点运行线程每行代码均被执行。但是就是不能播放mid文件。求高手帮帮给看看,谢谢了!

解决方案 »

  1.   

    我在主线程播放的,在子线程打开的。可是主线程没有动静。 PlayParms.dwCallback=(DWORD)GetSafeHwnd();
    mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_WAIT|MCI_NOTIFY,(DWORD)(LPVOID)&PlayParms);  
    m_bMusic=true;
      

  2.   

    打开和播放可以在两个线程实现吗?二者可以共享一个mci吗?
      

  3.   

    你看看m_wDeviceID在主线程和子线程是不是同样的值
      

  4.   

    MCI_WAIT是一直等到播放完后再去返回,有没有可能我里面还没打开文件就去播放了?
      

  5.   

    我在线程中加入播放代码,打开和播放全在子线程中的时候。
    mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)(LPVOID)&PlayParms);
    这样可以播放。如果将播放参数改为MCI_NOTIFY也不行了。
      

  6.   

    是的,程序想实现播放和暂停功能。我用线程之间通信好象也不行 。因为MCI_WAIT是播放完后再去返回,不能立刻停止播放音乐。MCI_NOTIFY在子线程中播放不了
      

  7.   

    程序想实现播放和暂停功能,这个用事件应该可以吧。
    MCI_NOTIFY在子线程中播放不了?这个可以的,我试过
      

  8.   

    MCI设备打开MID文件不能放在主线程中,因为太卡了