Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с СWinThread, как узнать, закончил ли выполняться? 
:(
    Опции темы
Dreamer_0x01
Дата 17.8.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Есть переменная типа CWinThread;
Завершаю программу способом "по флагу остановки"
То есть в процедуре потока есть фича вида
Код

while(!my_flag)
{
/*
Выполняем какие-то действия.
Действия могут выполняться до 1 секунды.
*/
}


Ну а в мое классе есть фича вида
Код

BOOL MyDialog::DestroyWindow()
{
my_flag=TRUE;
return CDialog::DestroyWindow();
}


Cуть проблемы в том, что период опроса флага достаточно большой. И если получается так, что мой основной поток уже зарылся, а тот еще продолжает работать, то выдается ошибка о неосвобождении памяти. Если же в основном потоке после присвоения переменной my_flag поставить Sleep(1010), то ошибка исчезает. Но это некрасиво, надо точно знать, сколько времени на завершение потока понадобится.
Поэтому хотелось бы знать функцию, которая вернет состояние потока, и ждать, пока поток не завершится самостоятельно, а уже потом убивать главное окно.
Пробовал ждать с помощью синхронизации - при запуске рабочего потока входить в критическую секцию, и выходить при завершении потока. А в главном потоке в DestroyWindow после установки флага завершения потока входить в эту же критическую секцию, тем самым усыпляя поток до момента выхода из критической секции второго потока. Работает, но как придется, то есть все равно какие-то доли секунды уходят на накладные расходы, за которые успевает закрыться основной поток. Здесь тоже помогало использование Sleep(10), но сами понимаете, что это некрасивый выход. Короче, надо как-то узнавать состояние потока. Причем уверен, что это просто. Но не знаю, какой функцией пользоваться.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 18.8.2005, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 5
Всего: 12



GetExitCodeThread() или можно ждать на HANDLE - WaitForSingleObject()

Если CWinThread с автоудалением, то тогда CWinThread * может быть недействительным.



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 18.8.2005, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



JoyEx
GetExitCodeThread() почему-то не работает, функция всегда STILL_ACTIVE.
Вот мой код:

Код

/*Wrtd - указатель на поток, полученный при AfxBeginThread()*/
    DWORD TEMP;
    BOOL b;
    HANDLE hnd=HANDLE(*this->Wtrd);
    do
    {
        b=::GetExitCodeThread(hnd,&TEMP);
    }
    while(TEMP==STILL_ACTIVE);


А Конструкция вида
Код

WaitForSingleObject(hnd,10000);

Помогает, спасибо!!!
Но я не понимаю, какое событие она отлавливает - почему срабатывает именно по выходу из потока, то есть именно так, как мне нужно.

Это сообщение отредактировал(а) Dreamer_0x01 - 18.8.2005, 11:17


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 18.8.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 5
Всего: 12



Цитата(Dreamer_0x01 @ 18.8.2005, 11:04)
JoyEx
GetExitCodeThread() почему-то не работает, функция всегда STILL_ACTIVE.

ну да, это же ведь Get - ExitCode - Thread smile пока поток жив, а когда он завершится, то тогда и получишь то, что вернет его управл. ф-ция
И потом, надо дублировать HANDLE потому, что его может закрыть сам CWinThread или CWinThread::m_bAutoDelete = FALSE

Цитата(Dreamer_0x01 @ 18.8.2005, 11:04)
А Конструкция вида
код C++
1:
WaitForSingleObject(hnd,10000);

Помогает, спасибо!!!
Но я не понимаю, какое событие она отлавливает - почему срабатывает именно по выходу из потока, то есть именно так, как мне нужно.


В MSDN пишут:
The WaitForSingleObject function can wait for the following objects:
  • Change notification
  • Console input
  • Event
  • Job
  • Memory resource notification
  • Mutex
  • Process
  • Semaphore
  • Thread
  • Waitable timer
Из HANDLE Thread WaitForSingleObject() узнает жив ли еще поток, не событие это вовсе

Это сообщение отредактировал(а) JoyEx - 18.8.2005, 15:04


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 18.8.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата

ну да, это же ведь Get - ExitCode - Thread  пока поток жив, а когда он завершится, то тогда и получишь то, что вернет его управл. ф-ция


В том то и дело, что у меня поток уже завершился, а в TEMP все равно STILL_ACTIVE сидит...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
JoyEx
Дата 18.8.2005, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 5
Всего: 12



Dreamer_0x01
Проверь, что вернула ф-ция + еще неплохо бы инициализировать TEMP

У тебя наверное первый раз ф-ция записала в TEMP STILL_ACTIVE, а потом туда ничего не писАла, а ты не проверял что (наверное, ЛОЖЬ) она возвращала.

Это сообщение отредактировал(а) JoyEx - 18.8.2005, 16:19


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Dreamer_0x01
Дата 18.8.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



JoyEx

Нет, смотрел в отладчике, функция всегда 1 возвращала.

А вот инициализация TEMP помогла!!! Видать, она этот кусок кода как-то соптимизировала по-своему. Теперь если перед вызовом функции обнулять TEMP, то все работает как надо.

Но все равно мне больше понравился метод с WaitForSingleObject. Так вроде бы даже грамотнее, не только проще.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 18.8.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Dreamer_0x01
Цитата
А вот инициализация TEMP помогла!!!

Ты в "семерке" работаешь?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 18.8.2005, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Coocky
Цитата

Ты в "семерке" работаешь?


Да


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 19.8.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Dreamer_0x01
Теперь понятно, откуда такое отношение к инициализации.
Надеешься на студию smile
Я еще с шестерки ВСЕГДА сам инициализирую переменные.Столько проблем решается.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 19.8.2005, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Coocky
А можешь пояснить, почему?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 19.8.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Dreamer_0x01
Цитата
А можешь пояснить, почему?

А ты не инициализируй, и пройдись в отладке через переменную.. smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 19.8.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Ну это-то понятно, что там мусор будет.
Но если она используется в функции, в которой все равно изменится ее значение - то зачем предварительная инициализация нужна?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Coocky
Дата 22.8.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Dreamer_0x01
Цитата
Но если она используется в функции, в которой все равно изменится ее значение - то зачем предварительная инициализация нужна?

smile
Ну дык откуда ты знаешь, что она не пользуется значением, передаваемым в функцию где-то внутри этой функции? smile
То что она возвращает значение по ссылке, еще не чего не значит.. smile
Может внутри есть такое..

Код

switch (TEMP)
{
case ... : ...... ;
case ... : ...... ;
case ... : ...... ;
case ... : ...... ;
default :...............;

}


А если ТЕМР мусор, то что передал , то и получишь smile
Во всяком случае поверь моему опыту (хоть и маленькому)smile




--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Dreamer_0x01
Дата 22.8.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата
Во всяком случае поверь моему опыту (хоть и маленькому)

Ладно те пребедняться smile

Цитата

Может внутри есть такое..
Код 
switch (TEMP)
{
case ... : ...... ;
case ... : ...... ;
case ... : ...... ;
case ... : ...... ;
default :...............;
}

А если ТЕМР мусор, то что передал , то и получишь


Хорошо,но как тогда узнать, какими значениями можно инициализировать TEMP, а какими нельзя? Ведь в хелпе этого не сказано... А в исходниках искать подобные вещи как-то не привлекает.



--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.