Страница 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 висит :shock:

После закрытия приложения, висит в процессах (dll)

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

После закрытия приложения, висит в процессах (dll)

Добавлено: 02 Ноябрь 2015, 15:08
gopstop2007
проблема оказалось банальна :( , привычка закрывать приложение с помощью крестика в правом углу, не закрыв открытое в приложении mdi окно в локальной версии-один exe файл проходило без проблем, но такое закрытие не корректно в dll сборки программы :idied:, и приложение не закрывалось

После закрытия приложения, висит в процессах (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-ки проекта.