C ++ - 通过多线程同时播放多个哔声?

时间:2016-02-22 20:11:36

标签: c++ multithreading winapi beep

是否可以同时播放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,或者这两种声音是否仍以某种方式相互阻挡?

2 个答案:

答案 0 :(得分:1)

您的代码暴露了我经常看到的问题(通常更好地隐藏),这会产生意想不到的结果并使开发人员无毛。也就是说,您没有考虑线程的生命周期。

当你启动一个新线程时(无论如何使用C ++ 11 std::thread),启动程序线程继续执行(在你的情况下,main())。除非你要求它,启动程序线程不会等待它刚刚启动的线程发生任何事情。它只是继续,而main()返回,根据定义,它意味着你的程序停止执行。没有人保证你开始的线程有机会完成任何操作!

你需要养成在从main返回之前等待线程完成的习惯 - 例如,使用thread::join。实际上,c ++ 11 thread类将在它的析构函数中中止该程序,除非该线程已加入或分离 - 但我认为分离的线程是一个糟糕的设计选择。

答案 1 :(得分:0)

Beep方法实际上来自恐龙时代,当时PC具有内置扬声器。 你猜怎么了?内部扬声器一次只能播放一种频率的声音。 如今,Windows只是模拟了这种行为,因此系统中的任何内容都无法使Windows一次播放2个或更多的BEEPS。