Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как грамотно закрыть программу  (Прочитано 25239 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
locator
Постоялец

ru
Offline Offline

« : 11-04-2007 18:08 » 

Доброго времени суток! При закрытии программы я выполняю в OnClose
кучу всяких действий: закрытие портов, убивание потоков и.т.д.
Однако, окно программы закрывается, а в диспетчере задач она продолжает висеть и
загрузка показывает 100%. Или еще хуже: окно не закрывается и
повисает. Как с этим бороться и вообще, как грамотно закрывать
программы? Спасибо за ответ!
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 11-04-2007 20:15 » 

С обработчика события OnClose ты что возрашаеш?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-04-2007 10:36 » 

Чтобы форма закрылась и ресурсы высвободились в OnClose нужно установить желаемой действие в Action. Напр.: Action := caFree
Также форму нужно убрать из списка предварительно создаваемых.
« Последнее редактирование: 12-04-2007 10:38 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
locator
Постоялец

ru
Offline Offline

« Ответ #3 : 12-04-2007 18:36 » 

Чтобы форма закрылась и ресурсы высвободились в OnClose нужно установить желаемой действие в Action. Напр.: Action := caFree
Также форму нужно убрать из списка предварительно создаваемых.
Так форма закрывается вроде, но ресурсы не овобождаются
Записан
locator
Постоялец

ru
Offline Offline

« Ответ #4 : 12-04-2007 18:37 » 

С обработчика события OnClose ты что возрашаеш?
ничего не возвращаю кажется, а как он может что-то возвращать?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 12-04-2007 19:31 » 

locator, Насколько я помню, в обработчик вроде подставляется функция. И насколько я помню Дельфи, вроде нужно просто ключевому слову result присвоить значение возврата при выходе из функции. Что именно, посмотри Help. 
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #6 : 16-04-2007 04:07 » 

OnClose, да и все стандартные обработчики событий в Delphi - процедура, а не функция, поэтому никакой Result здесь не нужен, более того, он вызовет ошибку компилляции.
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 //Какой то код
 Action:=caFree;
end;
Но думаю Action:=caFree; врядли поможет, скорее всего какие то проблемы в программе - может какой то поток еще работает, или порт не закрылся.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 16-04-2007 04:16 » 

zubr, есть свойство формы ModalResult. Согласно документации управление вернется в родительскую форму после установки ModalResult в значение отличное от ноля.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DemonicAlligator
Гость
« Ответ #8 : 16-04-2007 10:07 » 

ModalResult имеет значение только для модальных форм. Если форма немодальная, то присвоение ничего не изменит, пока явно не вызовешь Form.Close
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 16-04-2007 16:16 » 

Синий Аллигатор, да, в данном случае не рулит. Что-то я забыл, что это главная форма...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DemonicAlligator
Гость
« Ответ #10 : 17-04-2007 15:20 » 

locator, Рекомендую пробегать по списку потоков и проверять их закрытие... Ты как потоки завершаешь? Вызываешь Thread.Terminate а в методе Thread.Execute проверяешь  Thread.Terminated ?
Записан
locator
Постоялец

ru
Offline Offline

« Ответ #11 : 21-04-2007 09:22 » 

locator, Рекомендую пробегать по списку потоков и проверять их закрытие... Ты как потоки завершаешь? Вызываешь Thread.Terminate а в методе Thread.Execute проверяешь  Thread.Terminated ?
Просто вызываю Thread.TerminateHard и ничего не проверяю. Я так понял что надо проверять Thread.Terminated обязательно, иначе зависает поток
Записан
DemonicAlligator
Гость
« Ответ #12 : 23-04-2007 06:40 » new

Лучше в методе Execute внутри цикла проверять Terminated и если истина - освобождать все ресурсы и выходить из метода, тогда всё будет прибито корректно.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines