Здравствуйте, Аноним, Вы писали:
А>Среда MSVC++ c MFC А>Вопрос такой, есть основное приложение, оно запускает дополнительные потоки (в терминах MSDN userinterface thread, потоки наследуются от CWinThread) соответственно в каждом потоке свое окно. А>Если закрываем дочерние окна — все нормально. А>Если закрываем основное окно, то доп потоки убиваются уже без моего участия (что сильно расстраивает) причем убиваются они как то жестко, потому что даже WM_QUIT они не получают.
А>Проблема решается, отслеживанием того, чего насоздавали и рассылкой в CWinApp::ExitInstance() всем потокам WM_QUIT.
А>Однако, если теперь функциональность, связанную с доп потоками, вынести в ДЛЛ, то отслеживать и убивать их из основного приложения, становится совсем не хорошо — т.е. просто такой вариант нельзя делать в силу ограничений накладываемых на задачу. Соответствено, потоки убиваются не правильно — я бы не сильно переживал на этот счет, не настолько я пунктуальный программист, но работа потоков подразумевает создание временного файла который надо убивать по завершению потока(на самом деле все несколько сложнее, однако, суть дела не меняется), и то что это не происходит сильно напрягает.
А>Попытка отлова всевозможных DLL_THREAD_DETACH,DLL_PROCESS_DEATTACH,... в DllMain успехом не увенчались(вполне вероятно, что я просто не то в них делал) , но А>DLL_THREAD_DETACH — ни разу не пришло А>DLL_PROCESS_DEATTACH — приходит стабильно, но к этому времени мои доп потоки настолько занасилованы системой, что смысл их убивать уже нет, они и так не живые. А>_________
А>Вот здесь исходники тестового приложения(~8КБ) тока ногами не пинать, я на С++ с MFC пишу всего полгода
Вполне реальный выход — вставить в dll функцию (экспортируемую) типа CloseChildWindows с требованием клиенту вызывать ее перед завершением основного приложения. dll тоже модуль и имеет право на свой обработчик завершения.