使用多线程获得连续的哔哔声 我试图在C++中创建一个程序,在这里我播放一个哔哔声,它有一个频率和持续时间的用户选择。p>

使用多线程获得连续的哔哔声 我试图在C++中创建一个程序,在这里我播放一个哔哔声,它有一个频率和持续时间的用户选择。p>,c++,multithreading,winapi,beep,C++,Multithreading,Winapi,Beep,程序需要在播放哔哔声的同时继续运行 我想我应该使用多线程,但我没有这方面的经验 例如,这是一个简单的程序,但是当我使用\u beginthread时,我得到一个错误: #include "stdafx.h" #include <iostream> #include <Windows.h> #include <process.h> using namespace std; int freq = 0; int sec = 0; int mil = 0; vo

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

我想我应该使用多线程,但我没有这方面的经验

例如,这是一个简单的程序,但是当我使用
\u 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;
}
#包括“stdafx.h”
#包括
#包括
#包括
使用名称空间std;
intfreq=0;
整数秒=0;
int mil=0;
无效蜂鸣音(int freqq,int mill)
{
嘟嘟声(freqq,mill);
_endthread();
}
int main()
{
cout-freq;
库特秒;
密耳=1000*秒;
_beginthread(beepTone(freq,mil),0,NULL);

cout您的第一个示例无法编译,因为您实际上正在调用
beepTone()
,然后试图将其
void
返回值传递给
\u beginthread()
start\u address
参数,该参数将不起作用。您需要传递
beepTone()
将其自身设置为该参数,而不是其返回值

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

现在,为了实现您想要的功能,
\u 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吗?或者必须是C++ 98?它不一定是C++ 98的,但是老实说,我不知道你说的两个之间的区别,以及如何在它们之间进行改变。如果它能帮助你,我正在与Visual Studio 2017一起工作,我通过创建一个新的C++项目来启动我的程序。所以一切都在标准设置中。uess.vs2017支持C++11,因此您可以使用标准工具
而不是像
\u beginthread
这样的函数。感谢您的快速响应,但我不完全了解如何在代码中实现。正如我所说,我对线程是完全陌生的。
\u beginthread
是一个C函数。它需要特定的签名C++函数C++ C++ 11将线程引入C++中。C++线程允许你传递任何函数作为线程函数。Visual Studio 2017支持C++ 17,所以你可以利用C++。嗯,枪的儿子。我终于有机会坐下回答这个问题,你打败了我大约20秒。rst示例缺少对线程过程定义的调用约定。@IInspectable
\u beginthread()中线程过程的调用约定
\uuuu cdecl
。大多数C/C++编译器在没有明确说明调用约定时默认为
\uuu cdecl
。显然,如果将编译器的默认值配置为
\uu cdecl
以外的值,则需要明确说明调用约定,使其与预期定义匹配。
#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;
}
#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;
}