Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2011, 17:40   #1
Fiery Fox
Пользователь
 
Регистрация: 03.02.2010
Сообщений: 28
По умолчанию application.terminate (or halt)

Как успеть исполнить код до закрытия программы диспетчером?
Он, как я понимаю, обходит процедуры OnClose и OnCloseQuery формы.
Где записать код примерно такого содержания, что бы программа успела его выполнить? и реально ли это вобще?
Код:
last.Socket.SendText('COMClose');
Fiery Fox вне форума Ответить с цитированием
Старый 20.02.2011, 17:42   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Он, как я понимаю, обходит процедуры OnClose и OnCloseQuery формы.
Не а. Перед тем, как explorer закроет вашу программку, процедуры Close и CloseQuery будут выполнены.
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.02.2011, 17:47   #3
Fiery Fox
Пользователь
 
Регистрация: 03.02.2010
Сообщений: 28
По умолчанию

Даже если форма скрыта?
т.е
Код:
Application.ShowMainForm:=false; 
ShowWindow(application.Handle,SW_HIDE);
---
проверил, не пашет даже шоумесседж.
там идет какое то другое событие.
как бы экстренное завершение.
Fiery Fox вне форума Ответить с цитированием
Старый 20.02.2011, 17:56   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Как успеть исполнить код до закрытия программы диспетчером?

если задача снимается через [End Process], то никак.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 20.02.2011, 18:05   #5
Fiery Fox
Пользователь
 
Регистрация: 03.02.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> Как успеть исполнить код до закрытия программы диспетчером?

если задача снимается через [End Process], то никак.
Да, через нее.
Какая то же комманда идет приложению, может есть способ?
Fiery Fox вне форума Ответить с цитированием
Старый 20.02.2011, 18:12   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Нет, на сколько я знаю. Там просто прерывается работа всех потоков и ввода/вывода процесса в том месте, где они были. В частности, ТСП сокет на удаленной стороне рано или поздно вылетит по ошибке 10053 или 10054.

Единственное, что можно — это запускать 2 процесса, и если один прибили, то второй за него отомстит ))
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 20.02.2011, 18:19   #7
Fiery Fox
Пользователь
 
Регистрация: 03.02.2010
Сообщений: 28
По умолчанию

Если запущу 2 одинаковых, будет порт\соккет эррор.
Мне надо добиться того, что бы на стороне сервера не вылазила ошибка.
Прочел про хук процесса ZwTerminateProcess.
но как то это уже черезчур)

Судя по всему, единственный ок вариант будет блокировка диспетчера, пока не будет получен определенный сигнал со стороны сервера.

Последний раз редактировалось Stilet; 20.02.2011 в 19:04.
Fiery Fox вне форума Ответить с цитированием
Старый 20.02.2011, 18:35   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Если запущу 2 одинаковых, будет порт\соккет эррор.

ну не так прямолинейно, конечно )

> Мне надо добиться того, что бы на стороне сервера не вылазила ошибка.

Сервер не ваш, что ли? Тогда нереально. Разве что на низком уровне послать правильно сформированый пакет, который закроет удаленный сокет.

> Прочел про хук процесса ZwTerminateProcess.
> вариант будет блокировка диспетчера

Может и вариант. А что делать, если сетевую карту задизейблят, например? Или сетевой кабель уборщица шваброй заденет? Или провайдер упадёт?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 20.02.2011, 18:46   #9
Fiery Fox
Пользователь
 
Регистрация: 03.02.2010
Сообщений: 28
По умолчанию

>>Сервер не ваш, что ли? Тогда нереально. Разве что на низком уровне послать правильно сформированый пакет, который закроет удаленный сокет.

мой, но при работе, всплывающие ошибки не всегда хорошо)

Сделал все блокировкой диспетчера.
Думаю, что прокатит)

Цитата:
А что делать, если сетевую карту задизейблят, например? Или сетевой кабель уборщица шваброй заденет? Или провайдер упадёт?
Ну. Тогда уже никак)
Fiery Fox вне форума Ответить с цитированием
Старый 20.02.2011, 19:31   #10
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
мой, но при работе, всплывающие ошибки не всегда хорошо)
все ошибки можно придусматрети в ServerSocketsOnError
Код:
if errorkey = .. then правельно закрыть
FormDestroy не пробывали?
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Application.Terminate или Close? Alexei91 Общие вопросы Delphi 10 22.09.2010 03:50
APPLICATION c++ 4ika Общие вопросы C/C++ 1 14.04.2010 20:43
Application.terminate GAGARIN-NEW Общие вопросы Delphi 11 09.03.2008 19:32
ошибка terminate KORT Общие вопросы Delphi 9 07.10.2007 00:56
поток, который по завершению (Terminate) передает в основную форму информацию о файле 1Andrey1 Общие вопросы Delphi 5 10.09.2007 19:40