Использование многопоточности для получения непрерывного звукового сигнала

Я пытаюсь создать программу на 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 секунд, продолжая программу.

Может ли кто-нибудь помочь мне, как я могу сказать потоку, какую частоту и продолжительность играть?

1

Решение

Ваш первый пример не компилируется, потому что вы на самом деле звоните 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;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]