#include <Windows.h>
#include <process.h>
#include <string>
#include <iostream>
#pragma comment(lib,"winmm.lib")
volatile bool g_bEndMusicThread; //让线程结束的标志
//发送信息给MCI
bool SendToMCI(std::string command)
{
if(!mciSendString(command.c_str(),NULL,0,0))
return true;
return false;
}
//从MCI获取信息
std::string GetFromMCI(std::string command)
{
char message[20];
mciSendString(command.c_str(),message,20,0);
std::string str(message);
return str;
}
//音乐线程的方法
unsigned __stdcall ThreadPlayMusic(LPVOID lpParameter)
{
std::string Status="status MUSIC mode";
std::string Play="PLAY MUSIC FROM 0";
while(true)
{
Sleep(1);
if(g_bEndMusicThread==true) //接收主线程发送的退出信号
break;
std::string result=GetFromMCI(Status); //获取音乐状态
if(result=="stopped")
SendToMCI(Play); //如果音乐停止,重新播放
}
return 0;
}
//入口函数
int main(int argc, char *argv[])
{
std::string filepath="歌唱祖国.mid";
std::string Open="OPEN "+filepath+" ALIAS MUSIC";
std::string Close="CLOSE MUSIC";
SendToMCI(Open); //打开音乐文件
g_bEndMusicThread=false; //初始化子线程标志位
HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,ThreadPlayMusic,NULL,0,NULL); //创建线程
std::string GetCommand=""; //从控制台获取用户输入信息
while(true)
{
Sleep(1);
std::cin>>GetCommand;
if(GetCommand=="exit") //用户输入“exit”就退出
break;
}
g_bEndMusicThread=true; //通知子线程退出
WaitForSingleObject(hThread,INFINITE); //线程结束之后再释放资源
SendToMCI(Close); //关闭音乐文件
return 0;
}
评论1
最新资源