![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| soldatx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
Нужда помощь, каким образом принудительно завершить поток созданный _beginthreadex!
Предположим есть класс
При вызове метода Stop поток завершается, однако переменные,которые используются в myFunc не освобождаются что приводит к утечке памяти. Да и ваабще на сколько я понял TerminateThread не рекомендуется использовать. Собственно вопрос в том как корректно завершить поток созданный таким образом! |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: нет Всего: 60 |
||||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Поток создается всегда функцией CreateThread, что бы там ни было накручено до нее.
Корректно поток может завершиться только сам. Для чего необходимо предусмотреть соответствующие механизмы в функции потока. И лучше использовать события, а не флаги. Terminate действительно ничего не освобождает и использовать его нужно только в аварийном случае. Примерный механизм такой: тот, кто хочет завершить поток, выставляет событие stopEvent (заранее созданное и известное потоку) в сигнальное состояние и ждет завершения потока. Если в течении заданного интервала поток не завершится (мало ли что), вызывается Terminate. Предварительно можно о чем-нибудь спросить пользователя или еще что-то сделать. Внутри поток должен быть устроен так, чтобы периодически опрашивать событие stopEvent. Важно понимать, что если между опросами будет проходить больше времени, чем установлено для завершения потока, то вы упретесь в Terminate. Бесконечное время ждать нельзя - повесите приложение. -------------------- ... |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Почитай Рихтера, у него очень подробно всё описано.
http://www.ozon.ru/context/detail/id/4079733/ Это сообщение отредактировал(а) lv151 - 2.2.2009, 21:20 |
|||
|
||||
| soldatx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
Спасибо за советы! Про события c использованием setEvent и WaitForSingleObject читал, вродебы понял как и что но вот в чем загвоздка, есть следующий код, который выполняется в потоке:
1 .так вот дело в том что, немогу понять в каком месте мне вставить проверку флага или WaitForSingleObject ... в нутрь цыкла ReadDirectoryChangesW тогда выход из цикла произойдет не сразу а когда ReadDirectoryChangesW сгенерит событие изменения файловой системы. 2. как правильно создать флаг(событие) в классе что бы к ниму можно было обратиться из потока, у меня компилятор ругается ... недопустимая ссылка на нестатический член 'ClassA::_flag' |
|||
|
||||
| soldatx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
Единственное что приходит пока в голову это использовать переменные pInfo и pBuf как глобальные для класса и очищать их в месте с TerminateThread ....
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
в цикл While подставляй
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| soldatx |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
Да все бы ничего только в этот участок кода
я попадаю не сразу когда вызываю SetEvent, а когда происходит событие в файловой системе, только после этого отрабатывает :
|
||||
|
|||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
У тебя функция ReadDirectoryChanges блокирующая ? если нет непонятно в чем проблемы.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| soldatx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
по всей видемости да ... она забирает себе управление до тех пор пока в каталоге, который она просматривает не произойдет событие , после чего отдает управление дальше ((
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
а конкретней ?
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Переведи ReadDirectoryChangesW в overlapped режим и жди в WaitForMultipleObjects 2 event'а - один от ReadDirectoryChangesW и второй твой терминирующий
|
|||
|
||||
| soldatx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
как раз про это думал буду пробовать, спасибо за наводку. Dem_max конкретней уже не могу похоже запутался оканчательно, ну ниче разберусь пади. |
|||
|
||||
| soldatx |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 18.8.2008 Репутация: нет Всего: нет |
Что ж всем спасибо видемо вопросс решен однако предоставлю код который получился, я новичек в общем и поэтому буду очень признателен если глянете этот код и дадите пару подзатылников если заслужил
Добавлено через 3 минуты и 23 секунды А и еще ламерский вопросс (извеняюсь что не в тему) ... как можно проверить есть ли утечка памяти или нет! Я просто в диспетчере задач смотрел скоко занимает до создания и после удаления объекта и чуствую что это не правильно! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |