Если пользователь повторит все действия не выходя из программы, то функция потока не выполняется - C (СИ)
Формулировка задачи:
Вот тут я создаю поток в режиме ожидания (флаг CREATE_SUSPENDED):
После определенных действий пользователя у меня запускается поток:
Вот сама функция потока:
Поток отрабатывает как надо. Однако если пользователь повторит все эти действия не выходя из программы, то функция потока попросту не выполняется. Как быть?
HANDLE MainThread; MainThread = CreateThread(NULL, 0, MainThreadFunction, &countNodes, CREATE_SUSPENDED, &threadID);
ResumeThread(MainThread);
DWORD WINAPI MainThreadFunction(LPVOID lpParam) { printf("First thread start.\n"); /* тут какие-то действия */ printf("First thread end.\n"); return 0; }
Решение задачи: «Если пользователь повторит все действия не выходя из программы, то функция потока не выполняется»
textual
Листинг программы
DWORD r; ResumeThread(MainThread); r = GetLastError();
Объяснение кода листинга программы
- В начале кода объявляется переменная типа DWORD с именем
r
. DWORD - это тип данных, который обычно используется для хранения целых чисел с плавающей точкой, и он может содержать значения от 0 до 4294967295. - Затем вызывается функция ResumeThread(MainThread), где MainThread - это идентификатор потока, который нужно возобновить. Эта функция ожидает, что ей передадут дескриптор потока, и она будет использовать его для возобновления выполнения этого потока.
- После вызова функции ResumeThread в переменной
r
сохраняется результат ее работы. Результатом будет идентификатор успешно возобновленного потока или дескриптор, если возобновление не удалось. - Затем вызывается функция GetLastError(), которая возвращает последний код ошибки, произошедший в системе. Этот код затем сохраняется в переменной
r
. Таким образом, в данном коде сначала происходит попытка возобновить выполнение потока с идентификатором MainThread, а затем проверяется, была ли эта попытка успешной, путем проверки значения переменнойr
, которая после вызова функции ResumeThread должна содержать идентификатор успешно возобновленного потока. Если попытка возобновления не удалась, то в переменнойr
будет содержаться код ошибки, который можно получить, вызвав функцию GetLastError().
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д