Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

Процес не завершается   Найти похожие ветки 

 
KyRo   (2006-08-15 16:11) [0]

У меня проблема моя програмка запускается и после запуска сразу прячется в трей . На ней работают несколько таймеров которые с определенным интервалом выполняют свои задачи и все бы хорошо , но когда я пытаюсь перезагрузить компьютер или выключить его прога не дает этого сделать пока ее не выключиш.
Как сделать что бы она давала мне возможность правильно выключать комп или как отловить что комп получил команду перезагрузки или выключения ?


 
Сергей М. ©   (2006-08-15 16:25) [1]

см. WM_QUERYENDSESSION


 
KyRo   (2006-08-15 16:40) [2]

И где мне эту ExitWindows прописать ? Я ж не хочу что бы программа перезагружала виндовс или выключала его я хочу что бы пользователь когда выберет в виндовсе завершить работу программа закрылась !


 
Сергей М. ©   (2006-08-15 16:44) [3]


> И где мне эту ExitWindows прописать ?


Ты с дуба упал ?)

Где ты в [1] увидел хоть что-либо напоминающее необходимость вызова твоей программой ExitWindows() ?


 
KyRo   (2006-08-15 16:52) [4]

WM_QUERYENDSESSION
А я уже нашол что эхто но так и не понял в какой части программы отлавливать это сообщение виндовса


 
Сергей М. ©   (2006-08-15 16:54) [5]


> в какой части программы отлавливать это сообщение виндовса


В той же в какой "отлавливаются" все прочие сообщения виндовса.


 
KyRo   (2006-08-15 16:56) [6]


> В той же в какой "отлавливаются" все прочие сообщения виндовса.

Тогда подскажите мне где отлавливаются прочие ?


 
Сергей М. ©   (2006-08-15 16:57) [7]

Например, в обработчике Application.OnMessage


 
KyRo   (2006-08-15 17:01) [8]


> Сергей М. ©   (15.08.06 16:57) [7]
> Например, в обработчике Application.OnMessage

А можнопо подробнее я этого не когда не делал и  по этому не могу найти этот OnMessage или мне  надо создать этот обработчик в файле проэкта ?


 
KyRo   (2006-08-15 17:31) [9]

Нашол где это событие OnMessage буду пробовать


 
Leonid Troyanovsky ©   (2006-08-15 18:15) [10]


> Сергей М. ©   (15.08.06 16:57) [7]

> Например, в обработчике Application.OnMessage


Вряд ли. Оно ж is sent.

--
Regards, LVT.


 
KyRo   (2006-08-16 13:50) [11]

if Msg.message= WM_QUERYENDSESSION
  then
    Close;

Не подходит то что вы посоветовали не отлавливает оно завершение сессии


 
Сергей М. ©   (2006-08-16 13:58) [12]

А если без "запуздыривания в трей, там где часики" ?
Что, тоже "не отлавливает" ?


 
KyRo   (2006-08-16 14:23) [13]

Нет сделал  так

procedure WMQueryEndSession(var Msg: TWMQueryEndSession);  message WM_QUERYENDSESSION;

Procedure TATM.WMQueryEndSession(var Msg: TWMQueryEndSession);
 begin
   Msg.Result := 0;
   inherited;
   Close;
 end;


Отлавливает логоф , перезагрузку и выключение .
Срабатывает мое Close; и программа закрывается но при этом оно как то тушит сообщение виндовс и хоть программа уже и не запущена но винда дальше не перезагружается и перезагрузится  если повторить команду.
Как сделать что бы прога не убивала это сообщение или послала виндовс аналогичный меседж. ?


 
Сергей М. ©   (2006-08-16 14:27) [14]


> KyRo   (16.08.06 14:23) [13]


Ерундой ты занялся.
Достаточно обработать событие OnCloseQuery главной формы приложения, написав там

CanClose := True;


 
Сергей М. ©   (2006-08-16 14:30) [15]

Читаем исходники и удивляемся - оказывается, форма уже умеет "отлавливать" и обрабатывать такие сообщения !

function TCustomForm.CloseQuery: Boolean;
var
 I: Integer;
begin
 if FormStyle = fsMDIForm then
 begin
   Result := False;
   for I := 0 to MDIChildCount - 1 do
     if not MDIChildren[I].CloseQuery then Exit;
 end;
 Result := True;
 if Assigned(FOnCloseQuery) then FOnCloseQuery(Self, Result);
end;

procedure TCustomForm.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
 Message.Result := Integer(CloseQuery and CallTerminateProcs);
end;


 
KyRo   (2006-08-16 15:01) [16]

Убрал как ты советуеш и прописал
CanClose := True;
результат тот же программа не завершает работу


 
Сергей М. ©   (2006-08-16 15:08) [17]

А брейкпойнт ловишь на этой строчке ?


 
KyRo   (2006-08-16 15:11) [18]

нет брейкпойнт на этой строчке не ловлю


 
Сергей М. ©   (2006-08-16 15:18) [19]

Значит сообщение не поступает.


 
KyRo   (2006-08-16 15:25) [20]

Но если я перхватывал сообщение то оно поступало !!!


 
Сергей М. ©   (2006-08-16 15:27) [21]

Значит ты чего-то не договариваешь.


 
KyRo   (2006-08-16 15:39) [22]

:) Чего именно ?

Проверил событие возникает только когда я пытаюсь закрыть его руками нажимая на крестик. !


 
Сергей М. ©   (2006-08-16 15:42) [23]

Ты на [12] не ответил ...


 
KyRo   (2006-08-16 15:47) [24]

Тоже не отлавливает даже если не в трее . У меня как я понимаю гасят таймеры эти сообщения  из за них и не выключается.
Может мне просто отлавливать эти сообщения самому , а потом выполнять нужное действие через апи.
Только как из этих сообщений понять что послал виндовс ? (перезагрузку ,логоф или шутдаун)


 
Джо ©   (2006-08-16 15:48) [25]

> Только как из этих сообщений понять что послал виндовс ?
> (перезагрузку ,логоф или шутдаун)

Отличить перезагрузку от выключения нельзя никак  (it is not possible to determine which event is occurring (c) MSDN).


 
Сергей М. ©   (2006-08-16 15:49) [26]


> У меня как я понимаю гасят таймеры эти сообщения  из за
> них и не выключается


Ну так убирай нафих свои таймеры, если они "гасят")


 
Джо ©   (2006-08-16 15:50) [27]

> [24] KyRo   (16.08.06 15:47)

И что такого делают твои таймеры?


 
KyRo   (2006-08-16 15:56) [28]

Один работает как планировщик который каждых пять секунд проверяет время и запускает задание в нужное время,
А второй смотрит за логом работы программы  и регулярно сохроняет его на диск .


 
KyRo   (2006-08-16 15:56) [29]

По этому я не могу их убрать они мне необходимы


 
Джо ©   (2006-08-16 16:00) [30]

> [28] KyRo   (16.08.06 15:56)
> Один работает как планировщик который каждых пять секунд
> проверяет время и запускает задание в нужное время,

Плохое решение.

Таймеры "сами по себе" ничем не помешают перезагрузке ОС. Ищи ошибку методом исключений.


 
Сергей М. ©   (2006-08-16 16:02) [31]


> я не могу их убрать они мне необходимы


И долго ты придуриваться будешь ?)
Создай заведомо "чистое" приложение, безо всяких таймеров и прочей лабуды и проверь сабж)


 
KyRo   (2006-08-16 16:12) [32]

Проверил чистое приложение тушится и без всяких
CanClose := True; !!


 
KyRo   (2006-08-16 16:14) [33]


> Плохое решение.
>
> Таймеры "сами по себе" ничем не помешают перезагрузке ОС.
>  Ищи ошибку методом исключений.


То есть методом исключений.
Обычное не сложное приложение  которое работает с сетью и выполняет функцию планировщика !!
Пользуюсь в нем компонентами инди фтп клиент и винсоками .
Читаю и посылаю файлы потоками.
Еще есть два таймера
И все !!!


 
Сергей М. ©   (2006-08-16 16:17) [34]


> KyRo   (16.08.06 16:12) [32]
>
> Проверил чистое приложение тушится и без всяких
> CanClose := True; !!
>


И правильно !

Потому что CanClose = True по дифолту !

Ну а раз "чистое" приложение работает, а твое "грязное" не работает - ищи три "волшебных" отличия между ними)


 
Джо ©   (2006-08-16 16:17) [35]

> [33] KyRo   (16.08.06 16:14)
> Пользуюсь в нем компонентами инди фтп клиент и винсоками

Вот отсюда и начинай исключать.


 
KyRo   (2006-08-16 16:23) [36]


> > [33] KyRo   (16.08.06 16:14)
> > Пользуюсь в нем компонентами инди фтп клиент и винсоками
>
>
> Вот отсюда и начинай исключать.

А как исключать ? Мне нжні єти компоненты к ним привязан код . Да и вообще без них программа будет глючить !

И если так задуматся инди фтп клиент находится  не  в активном положении,
винсок клиент тоже , остается только винсок сервер который постоянно слушает порт и теоретически если исключить таймеры может блокировать перезагрузку.
Тогда вопрос почему он это делает ?


 
Джо ©   (2006-08-16 16:24) [37]

> [36] KyRo   (16.08.06 16:23)
> Тогда вопрос почему он это делает ?

В его коде есть ошибка? В твоем коде есть ошибка? Вариантов оч. много )


 
KyRo   (2006-08-16 16:37) [38]

не знаю но в моем коде ошибок  вроде бы нету


 
Сергей М. ©   (2006-08-16 16:39) [39]


> в моем коде ошибок  вроде бы нету


Да тебе памятник нерукотворный впору возводить !)


 
KyRo   (2006-08-16 17:02) [40]

Ну я не могу найти ее и у меня есть вторая программа которая работает с теми же компонентами у нее та же поблема



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.033 c
2-1155205159
GEM
2006-08-10 14:19
2006.09.03
Обработка большой БД. Ошибка "...is too large"


3-1151441197
Vosik
2006-06-28 00:46
2006.09.03
Триггеры на системных таблицах в InterBase


15-1154932290
tButton
2006-08-07 10:31
2006.09.03
закулисье)


6-1145269349
vcj
2006-04-17 14:22
2006.09.03
Delphi 7 + PHP 4-5


15-1155203084
DmitryS
2006-08-10 13:44
2006.09.03
Дайте совет по написанию трехзвенки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский