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++ - 通过多线程同时播放多个哔声?的主要内容,如果未能解决你的问题,请参考以下文章
python实现从FTP下载文件通过多线程同时分发到多台机器