使用多线程获得连续的蜂鸣声
Using multithreading to get continuous beep sound
我正在尝试用 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
return 值传递给 [=15] 的 start_address
参数=],这是行不通的。您需要将 beepTone()
本身传递给该参数,而不是它的 return 值。
您的第二个示例正确地将 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++ 创建一个程序,我在其中播放蜂鸣声,频率和持续时间由用户选择。
程序需要在播放提示音的同时继续运行。
我想我应该为此使用多线程,但我对此没有任何经验。
例如,这是一个简单的程序,但是当我使用 _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
return 值传递给 [=15] 的 start_address
参数=],这是行不通的。您需要将 beepTone()
本身传递给该参数,而不是它的 return 值。
您的第二个示例正确地将 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;
}