C++ - 通过多线程同时播放多个蜂鸣音

C++ - Play multiple Beeps simultaneously via multi-threading?

本文关键字:播放 多线程 C++      更新时间:2023-10-16

是否可以同时播放 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类将在其析构函数中中止程序,除非线程已连接或分离 - 但我认为分离线程是一个糟糕的设计选择。