Потоки в C с CreateThread()

Я очень новичок в C, и я пытаюсь создать программу для запуска MIDI-последовательностей, и в основном у меня есть две функции, каждая из которых выполняет другой шаблон MIDI, и мне нужно, чтобы они выполнялись параллельно. Из-за особенностей функций (одна исполняет последовательность, а другая воспроизводит случайные ноты), я почти на 100% уверен, что не смогу тогда работать с той же функцией.

Я искал в Интернете некоторые подсказки о том, как сделать это с помощью pthreads (которые, очевидно, не работают в Windows?) И CreateThread(), но я не могу заставить его работать. В настоящее время я пытаюсь использовать CreateThread () и пытаюсь ввести целые числа, необходимые для случайной миди-последовательности, и получаю сообщение об ошибке "LPTHREAD_START_ROUTINE", которое гласит: "ожидается" LPTHREAD_START_ROUTINE ", но аргумент имеет тип" DWORD (*)(int, int, int)'.

Этакий псевдокод того, над чем я работаю, находится здесь:

DWORD WINAPI solo_thread(int key, int tempo, int scale)
{
                  ///// this contains the random midi notes
}
int backing(int key, int tempo, int backing)
{
    HANDLE thread = CreateThread(NULL, 0, solo_thread, NULL, 0, NULL);
    if (thread) {
                 ////// this contains the midi sequence

}

Надеюсь, я хорошо объяснил свою проблему... Но я хорошо знаю, что наиболее вероятным случаем является то, что я делаю эту функцию CreateThread () всеми неправильными способами.

Спасибо!

1 ответ

Подпись функции входа потока, из ThreadProc() справочная страница:

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

а также solo_thread() не имеет этой подписи.

Если необходимо предоставить несколько аргументов функции, создайте struct содержит несколько членов, представляющих желаемые аргументы. Аргумент к потоку должен пережить поток, иначе поток будет обращаться к висячему указателю. Общее решение состоит в том, чтобы динамически распределить аргумент и получить поток free() это когда это больше не требуется.

Пример:

struct Thread_data
{
    int key;
    int tempo;
    int scale;
};

DWORD WINAPI solo_thread(void* arg)
{
    struct Thread_data* data = arg;

    /* Use 'data'. */

    free(data);
    return 0;
}

int backing(int key, int tempo, int backing)
{
    struct Thread_data* data = malloc(*data);
    if (data)
    {
        data->key   = key;
        data->tempo = tempo;
        data->scale = backing;
        HANDLE thread = CreateThread(NULL, 0, solo_thread, &data, 0, NULL);
    }
Другие вопросы по тегам