Я пытаюсь создать программу на 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;
}
Этот играет 1000 Гц в течение 3 секунд, продолжая программу.
Может ли кто-нибудь помочь мне, как я могу сказать потоку, какую частоту и продолжительность играть?
Ваш первый пример не компилируется, потому что вы на самом деле звоните beepTone()
а затем пытается передать его void
вернуть значение в start_address
параметр _beginthread()
, который не будет работать. Вам нужно пройти beepTone()
Сам по себе этот параметр, а не его возвращаемое значение.
Ваш второй пример правильно проходит 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;
}
Других решений пока нет …