gpt4 book ai didi

multithreading - waveOut (Win32API) 和多线程

转载 作者:行者123 更新时间:2023-12-04 08:26:23 24 4
gpt4 key购买 nike

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

创建新的 waveOut 句柄后,我有这些线程:

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

  • waveOutPrepareHeader
  • waveOutWrite
  • waveOutUnprepareHeader

线程 2:Gui, Controller 线程。使用这些 API 函数:

  • waveOutPause
  • waveOutRestart
  • waveOutReset
  • waveOutBreakLoop

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

这种架构是线程安全的吗?是否有任何关于 waveOut API 的线程安全的文档?关于 waveOut API 线程安全的任何其他建议?

谢谢。

最佳答案

一般来说,waveOut API 应该是线程安全的。因为通常 waveOutOpen() 会创建自己的线程,并且所有 waveOut* 函数都会向该线程发送消息。但我不能给你证据……

但是,您可以更改您的应用程序以使其在任何情况下都安全:

  1. 为缓冲区管理启动线程,记住 dwBufferThreadId
  2. 来自 GUI 线程调用 waveOutOpen with dwCallback设置为 dwBufferThreadId 和 fdwOpen 为 CALLBACK_THREAD
  3. 你的缓冲区管理线程:提前“waveOutWrite”一些缓冲区,GetMessage() 上的循环
  4. waveOutOpen 将在缓冲区完成且需要新缓冲区时发送 WOM_DONE,此时是从该线程内 waveOutWrite 新缓冲区的时刻
  5. 从 GUI 线程调用 waveOutPause、waveOutRestart 等(MSDN 中没有任何内容反对它,所有示例都这样做,即使缓冲区将从另一个线程填充)

example 1

如果你想 100% 确定,你可以获取一个 windows 消息 (WM_USER+0),然后调用 PostThreadMessage( WM_USER+0, dwBufferThreadId, MY_CTL_PAUSE,0 ) 然后在收到该消息在您的缓冲线程中,您在那里调用 waveOutPause() 。 Windows 消息队列为您节省了一些编写自己的消息队列的工作;-)

关于multithreading - waveOut (Win32API) 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1877210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com