Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Основной поток и порожденные, MFC / 10 сообщений из 10, страница 1 из 1
16.06.2006, 08:39
    #33794475
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
хто-нить может разжевать такую ситуацию:
Имеется приложение которое порождает множество дочерних потоков ... приложение закрывают, оно (СWinApp) рассылает порожденным потокам сообщение WM_QUIT(те закрывает их) ... в порожденных потоках запускается процесс деинсталяции каждый из которых может отнимать заметно большее время чем тербуемое для рассылки приложением уведолмлений дочерним потокам о завершении работы ... те оно разослало и продолжает свой СWinApp::ExitInstance() ... сейчас я создаю event на ожидание в основном потоке посылаю дочернему уведомление и приостанавливаю основной поток пока дочерний не скинет этот event и так в цикле по всем дочерним потокам ... может все эти заморочки с объектами ядра - лишние? те меня интересует вопрос нормально (до конца) ли завершатся дочерние потоки если основной уже будет убит системой в то время пока они (часть из них) еще работают (не завершены) ? ...
...
Рейтинг: 0 / 0
16.06.2006, 08:46
    #33794488
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
NSFuimusхто-нить может разжевать такую ситуацию:
Имеется приложение которое порождает множество дочерних потоков ... приложение закрывают, оно (СWinApp) рассылает порожденным потокам сообщение WM_QUIT(те закрывает их) ... в порожденных потоках запускается процесс деинсталяции каждый из которых может отнимать заметно большее время чем тербуемое для рассылки приложением уведолмлений дочерним потокам о завершении работы ... те оно разослало и продолжает свой СWinApp::ExitInstance() ... сейчас я создаю event на ожидание в основном потоке посылаю дочернему уведомление и приостанавливаю основной поток пока дочерний не скинет этот event и так в цикле по всем дочерним потокам ... может все эти заморочки с объектами ядра - лишние? те меня интересует вопрос нормально (до конца) ли завершатся дочерние потоки если основной уже будет убит системой в то время пока они (часть из них) еще работают (не завершены) ? ...
не нормально, возможны утечки.
...
Рейтинг: 0 / 0
16.06.2006, 08:49
    #33794491
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
Вообще единственным нормальным завершением потока считается самостоятельное достижение потоком точки выхода из него - return x. Другой вопрос как этого добиться, но я бы посоветовал контролировать хендлы потоков и по ним проверять активность потока при выходе из приложения.
Для этого можно сделать класс-контейнер для хранения всех описателей ну и т.д.
--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
16.06.2006, 08:57
    #33794503
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
дык контейнер есть ... как еще проще я могу узнать какие потоки запущены? не... с этим все ясно ... ладна ... оставим старый код как есть ...
...
Рейтинг: 0 / 0
16.06.2006, 09:05
    #33794515
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
хе ... врубился ... те ты предлагаешь делать ожидание не только на событие но и на хэндл потока? типа
Код: plaintext
1.
2.
3.
4.
			HANDLE h[ 2 ]; 
			h[ 0 ] = hEvent; 
			h[ 1 ] = pClientThread->m_hThread; 
			DWORD dw = WaitForMultipleObjects( 2 , h, FALSE, INFINITE/*60000*/); 
или только на хэндл потока?
...
Рейтинг: 0 / 0
16.06.2006, 09:23
    #33794549
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
NSFuimusхе ... врубился ... те ты предлагаешь делать ожидание не только на событие но и на хэндл потока? типа
Код: plaintext
1.
2.
3.
4.
			HANDLE h[ 2 ]; 
			h[ 0 ] = hEvent; 
			h[ 1 ] = pClientThread->m_hThread; 
			DWORD dw = WaitForMultipleObjects( 2 , h, FALSE, INFINITE/*60000*/); 
или только на хэндл потока?

через хендл ты можешь узнать состояние потока

Код: plaintext
1.
2.
3.
DWORD dw;
GetExitCodeThread(m_pThread->m_hThread, &dw);//----------- с каким кодом завершился поток
if(dw == STILL_ACTIVE)//-------------------------------------- поток еще работает 
{/*подождать или заполнить какую-либо глобальную переменную ориентируясь на которую потоки будут регулировать свое поведение но здесь надо отследить ее особенно в плане оптимизации*/}
...
Рейтинг: 0 / 0
16.06.2006, 09:30
    #33794557
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
хм ... а
Код: plaintext
1.
DWORD dw = WaitForSingleObject(m_pThread->m_hThread, INFINITE);
не пойдет?
...
Рейтинг: 0 / 0
16.06.2006, 09:32
    #33794564
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
NSFuimusхм ... а
Код: plaintext
1.
DWORD dw = WaitForSingleObject(m_pThread->m_hThread, INFINITE);
не пойдет?
можно и так, но если поток задержиться надолго эта функция заблокирует интерфейсный поток.
...
Рейтинг: 0 / 0
16.06.2006, 09:34
    #33794569
NSFuimus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
ладна ... спасибо ... натолкнул на дельную мысль ...
...
Рейтинг: 0 / 0
16.06.2006, 16:02
    #33796136
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Основной поток и порожденные, MFC
NSFuimusхто-нить может разжевать такую ситуацию:
Имеется приложение которое порождает множество дочерних потоков ... приложение закрывают, оно (СWinApp) рассылает порожденным потокам сообщение WM_QUIT(те закрывает их) ... в порожденных потоках запускается процесс деинсталяции каждый из которых может отнимать заметно большее время чем тербуемое для рассылки приложением уведолмлений дочерним потокам о завершении работы ... те оно разослало и продолжает свой СWinApp::ExitInstance() ... сейчас я создаю event на ожидание в основном потоке посылаю дочернему уведомление и приостанавливаю основной поток пока дочерний не скинет этот event и так в цикле по всем дочерним потокам ... может все эти заморочки с объектами ядра - лишние? те меня интересует вопрос нормально (до конца) ли завершатся дочерние потоки если основной уже будет убит системой в то время пока они (часть из них) еще работают (не завершены) ? ...

Вы делаете логически всё правильно. Единственное предложение, как тут уже прозвучало - после выставления окончания работы (не обязательно объект ядра) подождать на массиве хэндлеров всех Ваших потоков скопом (пример грамотного юзанья - Рихтер "Windows для профессионалов"). Всё без проблем работает в "боевых системах". Минусы которые хотелось бы отметить сразу (точнее не то что бы именно этого подхода, и я бы сказал - подводные камни) - это потоки ожидание на приёме пакетов. Либо он имеет квант ожидания (через которые он просматривает флаг), либо слать такому потоку пустой, сигнальный пакетик - дабы запустить логику...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Основной поток и порожденные, MFC / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]