首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >waveOut (Win32API)与多线程

waveOut (Win32API)与多线程
EN

Stack Overflow用户
提问于 2009-12-09 21:59:12
回答 3查看 6K关注 0票数 3

我找不到任何关于waveOut API的线程安全的信息。

在创建新的waveOut句柄之后,我拥有以下线程:

线程1:缓冲区处理。使用这些API函数:

  • waveOutPrepareHeader
  • waveOutWrite
  • waveOutUnprepareHeader

线程2: Gui,控制器线程。使用这些API函数:

  • waveOutPause
  • waveOutRestart
  • waveOutReset
  • waveOutBreakLoop

这两个线程同时使用相同的waveOut句柄运行。在我的测试中,我没有发现这个功能有任何问题,但这并不意味着它是安全的。

这个架构线程安全吗?有关于waveOut API的线程安全的文档吗?还有其他关于waveOut API线程安全的建议吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2009-12-10 06:30:17

我也没有看到任何文档,但我无法想象对waveOutWrite的调用与在同一个句柄上对WaveOutRestart的调用同时运行是安全的。

如果您正在使用VS2010 Beta2,我将查看代理库的各种演练,并尝试将其转化为生产者消费者问题,在这里您正在传递诸如写、暂停、重新启动等消息。

如果您没有使用Visual 2010 (或者不能使用),我将鼓励您找到一种方法,使用线程和存储要处理的命令的某种内部同步队列将其分解为生产者消费者问题。如果消息不是那么频繁,并且您只有两个线程在这个队列上工作,那么您就可以在std::Win32周围放置一个普通的旧的关键部分。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2009-12-18 12:15:11

可悲的是,即使在一个线程环境中,它也不安全。请看这个问题进行讨论:

为什么waveOutWrite()会导致调试堆中的异常?

试图向Microsoft报告这一情况导致他们关闭了该错误。他们不会修好的。

票数 2
EN

Stack Overflow用户

发布于 2009-12-16 01:28:41

它可能是线程安全的,但是如果您(或我)找不到任何说明它是线程安全的正式文档,那么假设它不是,并添加您自己的线程同步。一个轻量级的EnterCriticalSection / LeaveCriticalSection实现可能不超过十几行代码。

任何数量的测试都无法保证API是线程安全的:问题可能只发生在某些具有一定CPU或总线速度的体系结构上,或者只出现在一些声卡上。您(或Microsoft)都没有能力测试所有可能的配置。

您也不应该对微软、英特尔、声卡制造商或驱动程序编写者在将来的实现中会做什么做任何假设。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1877210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档