Win32 API 多线程播放 .wav 文件没有延迟

Posted

技术标签:

【中文标题】Win32 API 多线程播放 .wav 文件没有延迟【英文标题】:Win32 API multithreading to play .wav file with no lag 【发布时间】:2014-05-25 23:29:54 【问题描述】:

我正在尝试在我的 Win32 API pong 游戏中播放 .wav 声音。当一个桨向另一个桨发射“火球”时,我想播放 .wav 文件,但是在声音持续期间一切都停止了。我想用多线程来解决这个问题。

我试图解决这个问题的方式没有区别:

线程创建和函数调用:

std::thread t1(&Game::PlayFire, this);
t1.join();

播放声音功能:

void Game::PlayFire()

PlaySound(TEXT("fireball.wav"), NULL, SND_FILENAME);

我真的只是在寻找 std::head 解决方案,但是任何可能的答案都值得赞赏。

谢谢! 谢恩

【问题讨论】:

替换 t1.join();用 t1.detach();有效,但是我不确定这是否安全。我想我会发布它以防其他人遇到这个问题,并且我没有得到比我可以从谷歌中刮出的更多知识的帮助。更多帮助绝对值得赞赏,但这是一个有点有用的解决方案,前提是我没有遗漏任何东西。 您不需要将SND_ASYNC 作为标志传递吗? 【参考方案1】:

对 t1.join 的调用会阻止立即线程继续执行,直到 t1 完成

【讨论】:

谢谢,这是一个开始。老实说,我认为主游戏线程仍然暂停。这就是为什么我正在寻找解决方案或指导。 为了更详细地说明这一点,如果您要做的第一件事就是等待该线程退出,那么启动一个单独的线程来调用 PlaySound() 是没有意义的。【参考方案2】:

考虑使用 std::thread::detach (http://en.cppreference.com/w/cpp/thread/thread/detach)。

【讨论】:

啊,我刚刚在原始问题的评论中发布了这个。我相信这对我有用,我会在几个小时内将问题标记为已回答,以确保这是一个没有缺点的适当解决方案。

以上是关于Win32 API 多线程播放 .wav 文件没有延迟的主要内容,如果未能解决你的问题,请参考以下文章

Win32多线程调用gdal库接口

win32API多线程编程

win32多线程设计总结

在linux中播放一个wav文件[关闭]

win32 api是啥

win32 相关同步api