![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Ситуация такая:
dll-ка создает объект, объект, в свою очередь, запускает поток. Для завершения потока используется event, который устанавливается в деструкторе объекта. Но, как выяснилось, когда деструктор начинает выполняться - поток уже не работает.
dllmain.cpp
По идее при выполнении DLL_PROCESS_DETACH объект должен быть удален и поток остановлен, но этого не происходит, так как поток в момент выполнения delete obj; уже мертв. Как правильно дождаться завершения потока в dllMain, и возможно-ли это. Это сообщение отредактировал(а) Lazin - 16.10.2007, 14:55 |
||||
|
|||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Запоминай HANDLE потока и жди его WaitForSingleObject
-------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Я так и делаю,
на самом деле вместо комментария там ф-я WaitForSingleObject, которой в качестве аргумента передается хэндл потока. Дело в том что когда управление доходит до этого места поток уже завершен. Кстати забыл написать, что без dll код работает нормально (если подключить мой исходник к проекту). Но проблема в том что нужно именно в качестве длл. Мне кажется это связано с тем, что код который выполняется в потоке физически находится в dll, поэтому система и убивает его при выгрузке длл-ки, но точно я не знаю. |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Всего кода не вижу, но Вам стоило бы вот так примерно подстраховаться против выгрузки DLL
(там нечто аналогичное Вашему с потоками делается) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
спасибо за исходник, но там немного не то происходит, что мне нужно. Ситуация такая: Есть множество программ, использующих мою библиотеку(статичесски). Когда одна из программ загружает dll, мой код создает поток. При выгрузке библиотеки, нужно дождаться завершения потока, который должен выполнить определенную работу. Так вот, когда в ф-и DllMain выполняется
поток завершается, но не нормальным образом - как при TerminateThread. Возможности изменить клиентский код у меня нет. |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Проверьте точку входа DLL (если явно не ставили в опциях, то MSVC вызовет сначала свою)
Я бы не использовал всякие надстройки типа ::_endthread(); И перечитайте внимательнее Рихтера и MSDN по данному вопросу В качестве проверок поставьте точки прерывания в ключевых местах Удачи Вам! Тут несложно, только делать нужно самому, согласны? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
SergeCpp, Ok
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |