是否可以同时播放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,或者这两种声音是否仍以某种方式相互阻挡?
答案 0 :(得分:1)
您的代码暴露了我经常看到的问题(通常更好地隐藏),这会产生意想不到的结果并使开发人员无毛。也就是说,您没有考虑线程的生命周期。
当你启动一个新线程时(无论如何使用C ++ 11 std::thread
),启动程序线程继续执行(在你的情况下,main()
)。除非你要求它,启动程序线程不会等待它刚刚启动的线程发生任何事情。它只是继续,而main()
返回,根据定义,它意味着你的程序停止执行。没有人保证你开始的线程有机会完成任何操作!
你需要养成在从main返回之前等待线程完成的习惯 - 例如,使用thread::join
。实际上,c ++ 11 thread
类将在它的析构函数中中止该程序,除非该线程已加入或分离 - 但我认为分离的线程是一个糟糕的设计选择。
答案 1 :(得分:0)
Beep
方法实际上来自恐龙时代,当时PC具有内置扬声器。
你猜怎么了?内部扬声器一次只能播放一种频率的声音。
如今,Windows只是模拟了这种行为,因此系统中的任何内容都无法使Windows一次播放2个或更多的BEEPS。