使用多线程获得连续的哔哔声 我试图在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;
}