0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 26
1

Если пользователь повторит все действия не выходя из программы, то функция потока не выполняется

20.04.2014, 00:30. Показов 776. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот тут я создаю поток в режиме ожидания (флаг CREATE_SUSPENDED):
C
1
2
HANDLE MainThread;
MainThread = CreateThread(NULL, 0, MainThreadFunction, &countNodes, CREATE_SUSPENDED, &threadID);
После определенных действий пользователя у меня запускается поток:
C
1
ResumeThread(MainThread);
Вот сама функция потока:
C
1
2
3
4
5
6
DWORD WINAPI MainThreadFunction(LPVOID lpParam) {
printf("First thread start.\n");
/* тут какие-то действия */
printf("First thread end.\n");
return 0;
}
Поток отрабатывает как надо. Однако если пользователь повторит все эти действия не выходя из программы, то функция потока попросту не выполняется. Как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2014, 00:30
Ответы с готовыми решениями:

Вывести на экран "условие выполняется", если все элементы массива положительные и "условие не выполняется", если это не так.
1)Тип массива вещественный.Число элементов 11. Вывести на экран "условие выполняется", если все...

Если пользователь ничего не предпринимает в течении нескольких секунд, тогда выполняется какое-либо действие
Ребята, нужно написать программу. Если пользователь ничего не предпринимает в течении нескольких...

Regex - действия программы, если совпадений не найдено
Осуществляю поиск по html коду: string text1 = "Сокращенное наименование:"; var...

Отследить все действия программы
Возможно такое сделать? Т.е. я запускаю экзешник, и мне нужен полный отчет о его действиях. Что...

8
Ушел с форума
Эксперт С++
16468 / 7432 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
20.04.2014, 09:56 2
Цитата Сообщение от wondered Посмотреть сообщение
Однако если пользователь повторит все эти действия не выходя из программы, то функция потока попросту не выполняется. Как быть?
Сделать проверку ошибок. Например, проверить, что возвращают
CreateThread и ResumeThread при ошибке и что в этом случае говорит GetLastError.
Затем код из GetLastError вбить в Error Lookup и получить текстовое
описание проблемы.
1
0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 26
20.04.2014, 17:05  [ТС] 3
Забыл добавить, что при первом запуске потока когда он успешно запускается функция ResumeThread() возвращает 1, но после повторного запуска потока возвращает 0. Пытался выходить из потока путем ExitThread() - результат один и тот же
0
Ушел с форума
Эксперт С++
16468 / 7432 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
20.04.2014, 17:28 4
wondered, после того, как функция потока полностью
отработает, поток завершается. То есть, с этого момента потока
больше нет (хотя на него могут быть ссылки в виде открытых хэндлов,
но это уже не имеет значения). Вызывать на таком потоке ResumeThread
бессмысленно. И еще раз повторю - используйте GetLastError для
получения более подробной информации об ошибке. По одному лишь
FALSE очень мало чего можно понять.
0
0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 26
20.04.2014, 20:51  [ТС] 5
По вашему совету воспользовался функцией GetLastError().
Пользуюсь примерно так:
C
1
2
3
DWORD r;
ResumeThread(MainThread);
r = GetLastError();
Но функция в обеих случаях (первый запуск потока и второй) возвращает 0. Может я неправильно пользуюсь этой функцией?
0
Ушел с форума
Эксперт С++
16468 / 7432 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
20.04.2014, 22:43 6
wondered, глупое спрошу, но Вы CreateThread второй раз вызываете ?
0
0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 26
21.04.2014, 00:55  [ТС] 7
Нет. Вызываю только один раз в начале функции main(). Код вызова CreateThread писал выше.
0
Ушел с форума
Эксперт С++
16468 / 7432 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
21.04.2014, 11:56 8
wondered, функция потока отработала - поток завершен.
ResumeThread больше не сработает. Потока-то нет уже !
Вам нужно вызвать CreateThread повторно, чтобы создать еще один поток.
1
0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 26
21.04.2014, 13:55  [ТС] 9
Спасибо. Я почему-то думал что после выполнения функции потока поток переходит в режим ожидания до дальнейшего вызова Resumethread().
Дико благодарен за помощь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2014, 13:55
Помогаю со студенческими работами здесь

Продолжить работу программы если пользователь ничего не ввел
uses crt; var a,x:integer; begin clrscr; a:=77; randomize; writeln(' нажмите 0 для выхода');...

Начать новую игру не выходя из программы
Всем привет, создал маленькую программу типа СТАМИНА. Программа состоит из объекта label, таймера и...

Все элементы массива, следующие за заданным, возвести в квадрат, если выполняется условие
Если у массива А(20) есть элемент, равный квадрату последнего элемента,то все элементы, следующие...

Какие действия исполняет заданная часть программы? Если есть ошибки исправить их и объяснить исправления
. . . class Anketa { char *fam; char *name; public: Anketa ();...

Почему если условие входа в цикл не выполняется, функция заново входит в цикл
Сам код: private void traverse_node(TreeControlItem node) { TreeControlItem...

Возможность повторить расчет с новыми данными не выходя из программы.
Подскажите пожалуйста, как на С++ будет писаться код, который на Паскале пишется так: program...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru