gpt4 book ai didi

c++ - 使用多线程获得连续的蜂鸣声

转载 作者:行者123 更新时间:2023-11-30 03:23:19 27 4
gpt4 key购买 nike

我正在尝试用 C++ 创建一个程序,我在其中播放哔声,频率和持续时间由用户选择。

程序需要在播放哔声的同时继续运行。

我想我应该为此使用多线程,但我对此没有任何经验。

例如,这是一个简单的程序,但是当我使用_beginthread时出现错误:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <process.h>

using namespace std;

int freq = 0;
int sec = 0;
int mil = 0;

void beepTone(int freqq, int mill)
{
Beep(freqq, mill);
_endthread();
}

int main()
{
cout << "Frequency?" << endl;
cin >> freq;
cout << "Duration?" << endl;
cin >> sec;
mil = 1000 * sec;
_beginthread(beepTone(freq, mil), 0, NULL);
cout << "Test Threading";
return 0;
}

Argument of type "void(*)(int freqq, int mill)" is incompatible with parameter of type "_beginthread_proc_type"

我认为这个测试程序的重点很明确。

我有运行的代码,但在这段代码中我不能选择我自己的频率和持续时间:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <process.h>

using namespace std;

void beepTone(void *arg)
{
Beep(1000, 3000);
_endthread();
}

int main()
{
_beginthread(beepTone, 0, NULL);
cout << "Test Threading";
cin.get();
return 0;
}

这个程序在继续程序的同时播放 1000Hz 3 秒。

谁能帮我告诉线程播放的频率和持续时间?

最佳答案

您的第一个示例无法编译,因为您实际上是在调用 beepTone() 然后尝试将其 void 返回值传递给 start_address _beginthread() 的参数,这将不起作用。您需要将 beepTone() 本身传递给该参数,而不是它的返回值。

您的第二个示例正确地将 beepTone() 本身传递给 _beginThread(),但没有将任何数据传递给 beepTone()

现在,为了完成您想要的,_beginthread() 有一个 arglist 参数,您可以使用它来将用户数据传递给您的线程函数。这就是您需要用来将蜂鸣声值发送到线程,以便它可以将它们传递给 Beep()

尝试这样的事情:

#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#include <iostream>

using namespace std;

struct beepParams
{
int freq;
int mil;
};

void __cdecl beepTone(void *arg)
{
beepParams *params = static_cast<beepParams*>(arg);
Beep(params->freq, params->mil);
delete params;
_endthread();
}

int main()
{
int freq = 0, sec = 0, mil = 0;

cout << "Frequency?" << endl;
cin >> freq;
cout << "Duration?" << endl;
cin >> sec;
mil = 1000 * sec;

beepParams *params = new beepParams;
params->freq = freq;
params->mil = mil;

if (_beginthread(&beepTone, 0, params) == -1)
delete params;

cout << "Test Threading";
//...
cin.get();

return 0;
}

也就是说,如果您使用的是 C++11 或更高版本,请考虑改用 std::thread:

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <thread>

using namespace std;

struct beepParams
{
int freq;
int mil;
};

void beepTone(beepParams params)
{
Beep(params.freq, params.mil);
}

int main()
{
int freq = 0, sec = 0, mil = 0;

cout << "Frequency?" << endl;
cin >> freq;
cout << "Duration?" << endl;
cin >> sec;
mil = 1000 * sec;

beepParams params;
params.freq = freq;
params.mil = mil;

thread t(beepTone, params);
t.detach();

cout << "Test Threading";
//...
cin.get();

return 0;
}

关于c++ - 使用多线程获得连续的蜂鸣声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50451945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com