C++ - 通过多线程同时播放多个蜂鸣音
C++ - Play multiple Beeps simultaneously via multi-threading?
是否可以同时播放 2 声或更多声哔哔声(来自 windows.h)?在多线程方面,我非常缺乏经验,但以下不应该完成这项工作吗?
#include <thread>
#include <windows.h>
#include <iostream>
using namespace std;
void operation1();
void operation2();
int main()
{
thread task1 = thread(operation1);
thread task2 = thread(operation2);
task2.join();
task1.join();
return 0;
}
void operation1()
{
Beep(523, 1000);
}
void operation2()
{
Beep(262, 1000);
}
当我编译并运行它时,程序只播放频率为 262 Hz 的哔哔声。这是否意味着只调用了操作 2,或者这两个声音仍然以某种方式相互阻挡?
Beep
方法实际上来自恐龙时代,当时PC有内置扬声器。你猜怎么着?内置扬声器一次只能播放一个频率的一个声音。如今,Windows只是模拟这种行为,因此系统中没有任何内容可以使Windows一次播放2个或更多哔哔声。
您的代码暴露了一个我经常看到的问题(不过通常隐藏得更好),这会产生意想不到的结果并使开发人员无毛。也就是说,您没有考虑线程的生存期。
当您启动一个新线程时(无论如何,例如,使用 C++11 std::thread
),启动线程将继续执行(在您的情况下,main()
)。除非您要求它,否则启动线程不会等待它刚刚启动的线程发生任何事情。它只是继续前进,而不是main()
返回,根据定义,这意味着您的程序停止执行。没有人向您保证您启动的线程有机会执行任何操作!
您需要养成在从 main 返回之前等待线程完成的习惯 - 例如,通过使用 thread::join
.实际上,c++11 thread
类将在其析构函数中中止程序,除非线程已连接或分离 - 但我认为分离线程是一个糟糕的设计选择。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- C++ - 通过多线程同时播放多个蜂鸣音
- Win32 API多线程播放.wav文件没有延迟