Задать вопрос
@Nulltiton

Как исправить ошибку «Кадр не находится в модуле» при создании потока?

Создал процесс, который должен выполнять функцию вычисления факториала, однако при попытке запуска появляется ошибка "Кадр не находится в модуле". С чем это может быть связано и как это исправить?

int gn = 0;
scanf_s("%d", &gn);
HANDLE h = CreateThread(
    NULL,
    0,
    factorial(gn),
    NULL,
    NULL,
    NULL
);
CloseHandle(h);
return 0;
  • Вопрос задан
  • 438 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
"Кадр не находится в модуле". Подскажите с чем это может быть связано
HANDLE h = CreateThread(
    NULL,
    0,
    factorial(gn),
    NULL,
    NULL,
    NULL
);

Третий параметр CreateThread -- указатель на функцию, которая будет запущена в создаваемом потоке. А у тебя записано скорее всего что-то другое. Если ты хотел запустить функцию factorial в потоке, она должна 1) иметь определённый прототип (вот такой), и 2) в функцию CreateThread надо передать её адрес, а не результат её вызова (например, так: CreateThread(NULL, 0, factorial, NULL, NULL, NULL)). 3) если ты сделаешь эти два изменения, тебе прийдётся также переделать передачу параметра в функцию factorial и получение результата её работы.
Ответ написан
@Nulltiton Автор вопроса
Решил проблему при помощи глобальной, воспользовался примером из книги Побегайло - "Системное программирование в Windows".
Код:
#include <stdio.h>
#include <Windows.h>

int n;

DWORD WINAPI Add(int Num) {
	printf("Thread is started\n");
	n += Num;
	printf("Thread is finished\n");
}

int main() {

	int inc = 10;
	HANDLE hThread;
	DWORD IDThread;

	printf("n = %d\n", n);

	hThread = CreateThread(
		NULL,
		0,
		Add,
		(void*)inc,
		0,
		&IDThread);

	if (hThread == NULL)
		return GetLastError();

	WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);

	printf("n = %d\n", n);

	return 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы