Потоки в 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);
}