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

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

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

« Ответ #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 » 

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines