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

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;
}