使用多线程获得连续的哔声

时间:2018-05-21 15:22:29

标签: c++ multithreading winapi beep

我正在尝试用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秒。

任何人都可以帮助我如何告诉线程播放的频率和持续时间?

1 个答案:

答案 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