我正在尝试用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;
}
类型“void(*)(int freqq,int mill)”的参数与“_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秒。
任何人都可以帮助我如何告诉线程播放的频率和持续时间?
答案 0 :(得分:2)
您的第一个示例无法编译,因为您实际上正在调用beepTone()
,然后尝试将其void
返回值传递给start_address
的{{1}}参数,这不会工作。您需要将_beginthread()
本身传递给该参数,而不是其返回值。
您的第二个示例正确地将beepTone()
本身传递给beepTone()
,但未将任何数据传递给_beginThread()
。
现在,为了实现您的目标,beepTone()
有一个_beginthread()
参数,您可以使用该参数将用户数据传递给您的线程函数。这就是你需要用来将你的哔哔声值发送给线程,然后它可以将它们传递给arglist
。
尝试这样的事情:
Beep()
话虽如此,如果您使用的是C ++ 11或更高版本,请考虑改为使用#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;
}
:
std::thread