powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Основной поток и порожденные, MFC
10 сообщений из 10, страница 1 из 1
Основной поток и порожденные, MFC
    #33794475
NSFuimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хто-нить может разжевать такую ситуацию:
Имеется приложение которое порождает множество дочерних потоков ... приложение закрывают, оно (СWinApp) рассылает порожденным потокам сообщение WM_QUIT(те закрывает их) ... в порожденных потоках запускается процесс деинсталяции каждый из которых может отнимать заметно большее время чем тербуемое для рассылки приложением уведолмлений дочерним потокам о завершении работы ... те оно разослало и продолжает свой СWinApp::ExitInstance() ... сейчас я создаю event на ожидание в основном потоке посылаю дочернему уведомление и приостанавливаю основной поток пока дочерний не скинет этот event и так в цикле по всем дочерним потокам ... может все эти заморочки с объектами ядра - лишние? те меня интересует вопрос нормально (до конца) ли завершатся дочерние потоки если основной уже будет убит системой в то время пока они (часть из них) еще работают (не завершены) ? ...
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794488
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NSFuimusхто-нить может разжевать такую ситуацию:
Имеется приложение которое порождает множество дочерних потоков ... приложение закрывают, оно (СWinApp) рассылает порожденным потокам сообщение WM_QUIT(те закрывает их) ... в порожденных потоках запускается процесс деинсталяции каждый из которых может отнимать заметно большее время чем тербуемое для рассылки приложением уведолмлений дочерним потокам о завершении работы ... те оно разослало и продолжает свой СWinApp::ExitInstance() ... сейчас я создаю event на ожидание в основном потоке посылаю дочернему уведомление и приостанавливаю основной поток пока дочерний не скинет этот event и так в цикле по всем дочерним потокам ... может все эти заморочки с объектами ядра - лишние? те меня интересует вопрос нормально (до конца) ли завершатся дочерние потоки если основной уже будет убит системой в то время пока они (часть из них) еще работают (не завершены) ? ...
не нормально, возможны утечки.
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794491
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще единственным нормальным завершением потока считается самостоятельное достижение потоком точки выхода из него - return x. Другой вопрос как этого добиться, но я бы посоветовал контролировать хендлы потоков и по ним проверять активность потока при выходе из приложения.
Для этого можно сделать класс-контейнер для хранения всех описателей ну и т.д.
--------------------------------------------------------------
Don't worry - wear Huggies
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794503
NSFuimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык контейнер есть ... как еще проще я могу узнать какие потоки запущены? не... с этим все ясно ... ладна ... оставим старый код как есть ...
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794515
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*/); 
или только на хэндл потока?
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794549
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Основной поток и порожденные, MFC
    #33794557
NSFuimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм ... а
Код: plaintext
1.
DWORD dw = WaitForSingleObject(m_pThread->m_hThread, INFINITE);
не пойдет?
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794564
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NSFuimusхм ... а
Код: plaintext
1.
DWORD dw = WaitForSingleObject(m_pThread->m_hThread, INFINITE);
не пойдет?
можно и так, но если поток задержиться надолго эта функция заблокирует интерфейсный поток.
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33794569
NSFuimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладна ... спасибо ... натолкнул на дельную мысль ...
...
Рейтинг: 0 / 0
Основной поток и порожденные, MFC
    #33796136
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NSFuimusхто-нить может разжевать такую ситуацию:
Имеется приложение которое порождает множество дочерних потоков ... приложение закрывают, оно (СWinApp) рассылает порожденным потокам сообщение WM_QUIT(те закрывает их) ... в порожденных потоках запускается процесс деинсталяции каждый из которых может отнимать заметно большее время чем тербуемое для рассылки приложением уведолмлений дочерним потокам о завершении работы ... те оно разослало и продолжает свой СWinApp::ExitInstance() ... сейчас я создаю event на ожидание в основном потоке посылаю дочернему уведомление и приостанавливаю основной поток пока дочерний не скинет этот event и так в цикле по всем дочерним потокам ... может все эти заморочки с объектами ядра - лишние? те меня интересует вопрос нормально (до конца) ли завершатся дочерние потоки если основной уже будет убит системой в то время пока они (часть из них) еще работают (не завершены) ? ...

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


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


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