Страница 1 из 3
После закрытия приложения, висит в процессах (dll)
Добавлено: 01 Ноябрь 2015, 23:03
gopstop2007
После того как app пересобрал из локального в dll, заметил, что программа не всегда закрывается полностью, вернее закрывается, но продолжает висеть в процессах. Прошу Вашей помощи.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 10:27
Игорь Столяров
Бывает.

Скорее всего есть причины по которым подвисает выгрузка какого-то DLL из памяти.
1. Диагностируем проблемный DLL. В основном файле программы (MySoft.clw) ставим проверку выгрузки:
Код: Выделить всё
...
mydll3:Init(GlobalErrors, INIMgr) ! Initialise dll (ABC)
mydll2:Init(GlobalErrors, INIMgr) ! Initialise dll (ABC)
mydll1:Init(GlobalErrors, INIMgr) ! Initialise dll (ABC)
StartSoft
Message('Программа закрыта')
INIMgr.Update
Message('INIMgr успешно обновлен')
mydll1:Kill() ! Kill dll (ABC)
Message('MyDLL1 выгружена')
mydll2:Kill() ! Kill dll (ABC)
Message('MyDLL2 выгружена')
mydll3:Kill() ! Kill dll (ABC)
Message('MyDLL3 выгружена')
...
2. Вычислив проблемную DLL идем в ее метод Kill(), ставим аналогичные Checkpoin и смотрим, на каком этапе зависает.
3. Разбираемся с проблемой и устраняем ее.
По опыту могу сказать, что проблема наиболее вероятна в нарушении порядка вызовов Init() / Kill() сторонних методов
или некорректной работой с компонентами OCX из DLL.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 10:35
kreator
У нас такое постоянно, но на сервере (виртуальном). Причём вообще непонятно, может exe-шник остаться в памяти, может любая dll. Совершенно не зависит от версии Клариона. На локальной машине такого не наблюдается. Поэтому грешим на сервер.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 12:59
gopstop2007
kreator писал(а):На локальной машине такого не наблюдается. Поэтому грешим на сервер.
У меня на локальной машине.
Игорь Столяров писал(а):1. Диагностируем проблемный DLL. В основном файле программы (MySoft.clw) ставим проверку выгрузки:
Спасибо за помощь, проверил, все сообщения проходят, а exe висит

После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 13:14
kreator
А зайди в "Панель управления->Администрирование->Управление компьютером->Открытые файлы", посмотри все dll-ки висят, или не все.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 15:08
gopstop2007
проблема оказалось банальна

, привычка закрывать приложение с помощью крестика в правом углу, не закрыв открытое в приложении mdi окно в локальной версии-один exe файл проходило без проблем, но такое закрытие не корректно в dll сборки программы

, и приложение не закрывалось
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 15:39
kreator
Спорить не буду, но не научно это. Нажатие на крестик - это есть нормальный выход из программы. Что ещё нужно сделать для закрытия? Специально проверил у себя - всё нормально с нажатием на крестик. Правда у меня везде используется расширение "CleanCloseDownGlobal", но, думаю, оно не причём, оно работает в случае ухода операционки на перезагрузку или выключение.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 16:11
gopstop2007
kreator писал(а):Правда у меня везде используется расширение "CleanCloseDownGlobal"
ABCFree ? Очистка без очистки в Preserve в ini?
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 16:22
kreator
Обычный Global Extension. Правильно закрывает окна и само приложение в случае ухода операционки на перезагрузку. Иначе Винда сообщает - "Не могу перезагрузиться, запущена программа Имярек".
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 16:41
Shur
Отличительной чертой dll-проектов является рекомендация SV не употреблять в них команду HALT (см. help по команде). Проверьте у себя, что все команды HALT у вас в проекте закомментированы или заменены на что-нибудь эквивалентное (RETURN(1) например).
Может быть дело в этом?
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 17:03
Admin
Shur писал(а): рекомендация SV не употреблять в них команду HALT
В куче проектов использую HALT для выгрузки всех копий приложений у всех юзеров по флагу. Прекрасно работает и убивает программы.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 17:08
kreator
Admin писал(а):В куче проектов использую HALT для выгрузки всех копий приложений у всех юзеров по флагу. Прекрасно работает и убивает программы.
Но рекомендация не использовать HALT есть. Есть, кстати, и рекомендация использовать CleanCloseDown. Я тоже не встречал проблем с HALT, может потому, что использую CleanCloseDown.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 17:16
Shur
Не ругайтесь, тем более, что у меня такой кейз был. На то она и рекомендация. Иначе был бы запрет.
Гипотезу всё же лучше проверить.
После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 17:21
Игорь Столяров
Admin писал(а): В куче проектов использую HALT для выгрузки всех копий приложений у всех юзеров по флагу. Прекрасно работает и убивает программы.
Вообще, конечно жесть рубить работу приложения в произвольном месте.
Открыты файлы, возможно часть данных в буферах, выделена память ...

У нас в программах нет ни одного оператора HALT.
Как узнал сегодня - это еще и рекомендация SV. Вполне разумная.

После закрытия приложения, висит в процессах (dll)
Добавлено: 02 Ноябрь 2015, 17:35
kreator
Игорь Столяров писал(а):Как узнал сегодня - это еще и рекомендация SV. Вполне разумная.

Рекомендация касается только режима Multi-dll, предлагается альтернатива - CleanCloseDown. Всё. Видимо Halt'у наплевать на другие dll-ки проекта.