大家好,我是阿汤哥,上篇文章讲了怎么在命令行能播放音乐。
但是有个问题,那个程序运行起来,只能播放音乐,你不能和程序交互。
今天和大家讲讲,怎么给你的程序添加背景音乐BGM,播放音乐的同时,你也能在命令行打印字符,敲字符,和程序进行互动。
如何添加背景音乐?
这里我们用到Windows系统的多线程接口。什么是多线程,你可能有点蒙圈,说白点,一个线程就是一个工人,可以给你干一件活。通常我们写的程序,一个Main函数,它只有一个主线程,程序顺序执行,一步步地。多线程就是除了主线程这个工人,还可以创建子线程,找来其他工人,同时给你做其他事情。
今天,我们就创建一个子线程,找另一个工人来,来播放背景音乐BGM,只要主程序不退出,背景音乐可以一直放。
一个简单的字符程序游戏:
输入字符'a',打印"A for Apple";
输入字符'b',打印"B for ball";
输入字符'c',打印“C for cat”。
同时,程序运行过程中,播放BGM。
介绍下Windows系统创建线程的关键函数CreateThread:
HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId );
你可能有点懵,你先不用管它的具体含义,用起来很简单。在主函数里这样调用这个函数,创建线程:
CreateThread(NULL,0,线程函数名,NULL,0,NULL);
另外,线程要执行任务,需要有个对应的函数,先定义一个线程所要执行的函数:
这里,我们不妨命名为:play_bgm_poc。线程函数有他的固定格式,函数头这样写:
DWORD WINAPI play_bgm_poc(LPVOID lpParameter)
函数体里面,写播放音乐的代码。下面附上完整代码。
代码
/**
* 功能: 给程序添加BGM背景音乐
* Author: 阿汤哥
* 微信公众号:C语言修仙
*/
#pragma comment(lib,"Winmm.lib")
#include
#include
#include
#include
#include
#include
#include
#include
int index = 0;
DWORD WINAPI play_bgm_poc(LPVOID lpParameter){
static MCI_OPEN_PARMS mciOpen;
static MCI_PLAY_PARMS mciPlay;
static MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;
//开始播放
mciOpen.lpstrElementName = "D:\\dnxk.mp3"; //可以改成你自己的歌曲目录
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
mciSendCommand(mciOpen.wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT,
(DWORD)&mciPlay);
//设置初始音量
mciSendCommand(mciOpen.wDeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE |
MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mciSetAudioPara);
printf("Playing BGM\n");
return 0;
}
int main(){
HANDLE hThread1;
hThread1=CreateThread(NULL,0,play_bgm_poc,NULL,0,NULL);
CloseHandle(hThread1);
printf("hello world\n");
char ch;
while(1)
{
ch = getchar();
if (ch == 'a')
printf("A for apple\n\n");
else if (ch == 'b')
printf("B for ball\n\n");
else if (ch == 'c')
printf("C for cat\n\n");
}
return 0;
}
运行效果
见视频:
写在最后
你以后写程序,特别是那种大一点的程序,比如图书管理系统这些,运行时间比较长,短时间不退出的,可以加上背景BGM。
喜欢的话,记得分享和在看。