【发布时间】:2019-06-13 11:05:39
【问题描述】:
我正在编写一个 C++ Windows 应用程序,它需要从一个数组中播放一首随机选择的歌曲,并且用户需要能够通过单击一个按钮来播放列表中的另一首歌曲。你会如何停止第一首歌曲的声音以播放第二首歌曲?
通过按下播放第一首歌曲的按钮,播放音频资源,但是我的程序不再响应任何点击,并且代码在歌曲完成之前不会继续。我曾尝试使用 CreateThread(),但无济于事,因为我的程序仍处于无响应状态。
包含 PlaySound 的函数:
LPTHREAD_START_ROUTINE WINAPI PlayWavFile(int resource) {
PlaySound(MAKEINTRESOURCE(resource), hInst, SND_RESOURCE | SND_SYNC);
return 0;
}
WndProc 函数中判断按钮按下结果的情况:
case WM_COMMAND:
if (LOWORD(wParam) == 1) {
HANDLE hThread = CreateThread(
NULL,
0,
PlayWavFile(i),
NULL,
NULL,
NULL
);
}
else if (LOWORD(wParam) == 2) {
HANDLE hPlaySecond = CreateThread(
NULL,
0,
PlayWavFile(j),
NULL,
NULL,
NULL
);
}
else if (LOWORD(wParam) == 3) {
HANDLE hStop = CreateThread(
NULL,
0,
PlayWavFile(NULL),
NULL,
NULL,
NULL
);
}
break;
此外,如果我尝试单击应将 wParam 值设为 3 的按钮,则程序会遇到异常,该异常指出:
Audio Player.exe 在 0x00000000 处引发异常:0xC0000005:执行位置 0x00000000 的访问冲突。发生了。
最终目标是程序在后台播放音乐时做出响应。
【问题讨论】:
-
与基本问题无关,但绝对与您的解决方案尝试有关,您在创建每个线程时都会泄漏线程句柄。如果您不打算通过 waitforsingleobject 或类似方法等待线程,则应关闭从 CreateThread 返回的线程句柄。