![]() |
|
|
![]()
|
|
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Есть переменная типа CWinThread;
Завершаю программу способом "по флагу остановки" То есть в процедуре потока есть фича вида
Ну а в мое классе есть фича вида
Cуть проблемы в том, что период опроса флага достаточно большой. И если получается так, что мой основной поток уже зарылся, а тот еще продолжает работать, то выдается ошибка о неосвобождении памяти. Если же в основном потоке после присвоения переменной my_flag поставить Sleep(1010), то ошибка исчезает. Но это некрасиво, надо точно знать, сколько времени на завершение потока понадобится. Поэтому хотелось бы знать функцию, которая вернет состояние потока, и ждать, пока поток не завершится самостоятельно, а уже потом убивать главное окно. Пробовал ждать с помощью синхронизации - при запуске рабочего потока входить в критическую секцию, и выходить при завершении потока. А в главном потоке в DestroyWindow после установки флага завершения потока входить в эту же критическую секцию, тем самым усыпляя поток до момента выхода из критической секции второго потока. Работает, но как придется, то есть все равно какие-то доли секунды уходят на накладные расходы, за которые успевает закрыться основной поток. Здесь тоже помогало использование Sleep(10), но сами понимаете, что это некрасивый выход. Короче, надо как-то узнавать состояние потока. Причем уверен, что это просто. Но не знаю, какой функцией пользоваться. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
GetExitCodeThread() или можно ждать на HANDLE - WaitForSingleObject()
Если CWinThread с автоудалением, то тогда CWinThread * может быть недействительным. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
JoyEx
GetExitCodeThread() почему-то не работает, функция всегда STILL_ACTIVE. Вот мой код:
А Конструкция вида
Помогает, спасибо!!! Но я не понимаю, какое событие она отлавливает - почему срабатывает именно по выходу из потока, то есть именно так, как мне нужно. Это сообщение отредактировал(а) Dreamer_0x01 - 18.8.2005, 11:17 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| JoyEx |
|
||||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
ну да, это же ведь Get - ExitCode - Thread И потом, надо дублировать HANDLE потому, что его может закрыть сам CWinThread или CWinThread::m_bAutoDelete = FALSE
В MSDN пишут: The WaitForSingleObject function can wait for the following objects:
Это сообщение отредактировал(а) JoyEx - 18.8.2005, 15:04 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
||||
|
|||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
В том то и дело, что у меня поток уже завершился, а в TEMP все равно STILL_ACTIVE сидит... -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Dreamer_0x01
Проверь, что вернула ф-ция + еще неплохо бы инициализировать TEMP У тебя наверное первый раз ф-ция записала в TEMP STILL_ACTIVE, а потом туда ничего не писАла, а ты не проверял что (наверное, ЛОЖЬ) она возвращала. Это сообщение отредактировал(а) JoyEx - 18.8.2005, 16:19 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
JoyEx
Нет, смотрел в отладчике, функция всегда 1 возвращала. А вот инициализация TEMP помогла!!! Видать, она этот кусок кода как-то соптимизировала по-своему. Теперь если перед вызовом функции обнулять TEMP, то все работает как надо. Но все равно мне больше понравился метод с WaitForSingleObject. Так вроде бы даже грамотнее, не только проще. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Dreamer_0x01
Ты в "семерке" работаешь? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Coocky
Да -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Dreamer_0x01
Теперь понятно, откуда такое отношение к инициализации. Надеешься на студию Я еще с шестерки ВСЕГДА сам инициализирую переменные.Столько проблем решается.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Coocky
А можешь пояснить, почему? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Dreamer_0x01
А ты не инициализируй, и пройдись в отладке через переменную.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Ну это-то понятно, что там мусор будет.
Но если она используется в функции, в которой все равно изменится ее значение - то зачем предварительная инициализация нужна? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Dreamer_0x01
Ну дык откуда ты знаешь, что она не пользуется значением, передаваемым в функцию где-то внутри этой функции? То что она возвращает значение по ссылке, еще не чего не значит.. Может внутри есть такое..
А если ТЕМР мусор, то что передал , то и получишь Во всяком случае поверь моему опыту (хоть и маленькому) -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
||||
|
|||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Ладно те пребедняться
Хорошо,но как тогда узнать, какими значениями можно инициализировать TEMP, а какими нельзя? Ведь в хелпе этого не сказано... А в исходниках искать подобные вещи как-то не привлекает. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |