Использование многопоточности для получения непрерывного звукового сигнала - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь создать программу на 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 Ответ

0 голосов
/ 21 мая 2018

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