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

Posted

技术标签:

【中文标题】C++ - 通过多线程同时播放多个哔声?【英文标题】:C++ - Play multiple Beeps simultaneously via multi-threading? 【发布时间】:2016-02-22 20:11:36 【问题描述】:

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

【问题讨论】:

您的程序将立即终止,因为您没有等待线程完成。您需要在它们上调用join() 以等待它们完成,然后再从您的主函数返回。 @JonathanPotter,它实际上应该崩溃。我想知道 Lukas 是否在关注他的程序行为。 哦,是的,对不起。我确实在我的程序中调用了 join() 。出于某种原因,我没有复制它。 您的实际代码和您发布的代码之间还有什么不同? 我没有看到任何证据表明您可以期望同时播放两种声音。哔声是一个古老的遗留功能。不要使用它。你想做什么?为什么你决定 Beep 是解决方案? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

感谢您的回答。有趣的是:我不知何故错过了这两行:task2.join();和 task1.join() 将我的代码复制到此页面时。但即使有这些命令,我​​仍然只能听到一声哔声。

以上是关于C++ - 通过多线程同时播放多个哔声?的主要内容,如果未能解决你的问题,请参考以下文章

JNI 通过多线程从 C++ 调用 Java

python实现从FTP下载文件通过多线程同时分发到多台机器

C++多线程强制终止

多线程通识

是否有可能以某种方式同时在 ZMQ 中使用 Send/Recv(通过多线程)?

如何通过多线程使用socket和pyqt避免数据丢失