Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как культурно закрыть процесс ? [D6, Win2k]


Страницы:   1 2

Sasha73 ©   (2004-07-28 12:45:00) 

Добрый день, уважаемые мастера!
Вопрос глупый, но все же!
Есть програмка:
Program Mishen;
Uses
 Windows, SysUtils, Forms, QDialogs, QControls, ExtCtrls;

{$R *.RES}

  Var
     Quit     : Bool;

BEGIN
    Quit:=False;
    Application.Initialize;
    Repeat
          Application.ProcessMessages;
          Sleep(50);
    Until Quit;

    ShowMessage('Exit!');
END.

Вопросы:
1. Как узнать что Win-да выгружается (как, чем поймать сообщение WM_Quit) (очень туго у меня с сообщениями)?
2. Как из другого процесса послать сообщение WM_Quit этому ?


Sasha73   (2004-08-05 12:13:00) [1]

СПАСИБО ВСЕМ!
Извините, что долго не отвечал - несколько дней Инет не работал (хотя Вы, наверное, только рады были  ;-) )!

> Digitman ©   (30.07.04 11:25) [30]
- этот код тоже не помог (ничего не происходит)!

Думаю тему можно закрывать - я все таки создал окно через CreateWindowEx()- там все ловится без вопросов, ну и черт с ним!!!


Игорь Шевченко   (2004-08-03 18:10:00) [2]

Kurtevich

Ты б матчасть выучил, что ли...Прежде чем всякий бред постить


Digitman   (2004-07-30 11:25:00) [3]

function MyTerminateFunc: Boolean;
begin
 Log('MyTerminateFunc');
 Result := True;
end;
...
   Application.Initialize;
   AddTerminateProc(@MyTerminateFunc);
   repeat
         Application.HandleMessage
   until Application.Terminated;


Sasha73   (2004-07-30 10:59:00) [4]


> ну messageBox() поймал ?

Нету никакого MessageBox() (на экране), ни лога "Exit" в файле!
А если прочитать внимательно > Sasha73 ©   (29.07.04 13:50) [24], то вообще видно, что кроме WM_TIMER, ни хрена больше не ловится!
МОЖЕТ ПЛЮНУТЬ НА ВСЕ ЭТО?


Digitman   (2004-07-30 08:15:00) [5]


> Sasha73 ©   (29.07.04 15:38) [26]


> формы нет - может поэтому


да ни причем здесь форма, она лишь ощутимо упростит реализацию алгоритма в целом

ну messageBox() поймал ?


> Kurtevich   (29.07.04 19:09) [27]
> придется наверно создавать невидимое окно и ловить для него
> сообщения


объект Application  и так уже создает невидимое окно, на кой ляд еще одно создавать ?


Kurtevich   (2004-07-29 19:09:00) [6]

придется наверно создавать невидимое окно и ловить для него сообщения.... праа лишних строчек, зато намного цивильнее :))


Sasha73   (2004-07-29 15:38:00) [7]

Я не полностью код привел. Было так:

    Application.Initialize;
    Log('Запуск удачный!');
    repeat
          Application.HandleMessage
    until Application.Terminated;
    ShowMessage('Exit!');
    Log('Exit');


Да и процедура Logнезамысловатая:

Procedure Log( St : String );
   Const
        FileMailLog = '__exit.log';
     Var
        FOut              : TextFile;
   Begin
        AssignFile(FOut,FileMailLog);
        {$I-}
        If FileExists(FileMailLog) then Append(FOut) else ReWrite(FOut);
        {$I+}
        If IOResult=0 then
           Begin
                WriteLn(FOut,FormatDateTime('dd/mm/yyyy hh:nn:ss  ',Now)+St);
                CloseFile(FOut)
           End
   End;


Но все же формы нет- может поэтому!


Digitman   (2004-07-29 14:04:00) [8]

repeat
Application.HandleMessage
until Terminated;
MessageBox(0, 'Завершение процесса', '', mb_ok + mb_setforeground);

если увидишь это сообщение, то разбирайся , почему твой лог не работает - значит, что-то в нем некорректно


Sasha73   (2004-07-29 13:50:00) [9]

Извините, кого задолбал полностью!
Но пишем:

    Log('Запуск удачный!');
    While GetMessage(Msg, 0, 0, 0) do begin
        If Msg.Message=WM_TIMER then Log('Сообщение: WM_TIMER');
        If Msg.Message<>WM_TIMER then Log('Сообщение '+IntToStr(Msg.message)+'!');
    end;
    Log('Exit');

Получаем лог:
29.07.2004 12:20:59  Запуск удачный!
29.07.2004 12:20:59  Сообщение: WM_TIMER
29.07.2004 12:21:00  Сообщение: WM_TIMER
29.07.2004 12:21:00  Сообщение: WM_TIMER
29.07.2004 12:21:00  Сообщение: WM_TIMER
29.07.2004 12:21:00  Сообщение: WM_TIMER
29.07.2004 12:21:00  Сообщение: WM_TIMER
29.07.2004 12:21:01  Сообщение: WM_TIMER
29.07.2004 12:21:01  Сообщение: WM_TIMER
29.07.2004 12:21:01  Сообщение: WM_TIMER
29.07.2004 12:21:01  Сообщение: WM_TIMER
29.07.2004 12:21:01  Сообщение: WM_TIMER
29.07.2004 12:21:02  Сообщение: WM_TIMER
29.07.2004 12:21:02  Сообщение: WM_TIMER
29.07.2004 12:21:02  Сообщение: WM_TIMER
29.07.2004 12:21:02  Сообщение: WM_TIMER
29.07.2004 12:21:02  Сообщение: WM_TIMER
29.07.2004 12:21:03  Сообщение: WM_TIMER


Это с момента работы и до перезагрузки Винды (не резетом ;-))!
Где в логе "Exit", неужели Винда не посылает ничего перед выгрузкой, неужели она делает   TerminateProcess(...)? Где я не прав?
Мне просто нужно сохранение сделать вместо Log('Exit');

Кстати код ( > Digitman ©   (28.07.04 15:33) [15]) :
repeat
Application.HandleMessage
until Terminated;
Log('Exit');

Тоже ничего не оставляет в логе при перезагрузке!

P.S.:
И отдельно хотелось бы ответить на фразу:

>Digitman ©   (28.07.04 14:13) [11]
> а вообще говоря выражение "не работает" отдает детским садом,
> а не речью программиста ... что значит "не работает" ?


Мне кажется форумы созданы не только для крутых программистов!
Я например занимаюсь Администрированием!
А писать приходится только для себя, чтобы облегчить себе работу!
Учился всему только сам (с книжками), да и то под ДОС! Знаю паскаль, ассемблер (не на высшем уровне, но все таки)!
Под ДОС-ом, как по мне, все гораздо проще было - разобрался с прерываниями и функциями ДОС, БИОС и можно писать!
А в Винде тут всякие сообщения, исключения, методы, классы,....-черт ногу сломает! Нету у меня времени этим заниматься!
Я бы то и не лез в это, но, говорю ж, пытаюсь облегчить себе жизнь (а Вам, наверное, отяжелить) - почтового робота, например, написать, да и еще для Офиса кое-что!
Поэтому, не судите строго!


Digitman   (2004-07-29 13:38:00) [10]


> Kurtevich   (29.07.04 12:58) [22]


а что это тебя так задело ? ...
ты предлагаешь заведомо "кривой" вариант, да еще и не используя ГОТОВЫХ возможностей Application (коль автор на нем таки настаивает) - и после этого еще у тебя хватает совести делать заявления а-ля "дельный совет дать его че-то ломит" ? Дельный совет автор получил уже в [15], НО после анализа требований по действительной необходимости исп-я TApplication !


Kurtevich   (2004-07-29 12:58:00) [11]

ладно, ладно... GetMessage конечно же лучше... если б я не полез в исходники tapplication, то про Peek Message я б даже и не узнал никогда... а мораль - нефиг лазить по всяким...

Log('Запуск удачный!');
   While GetMessage(Msg, 0, 0, 0) do
     if Msg.Message <> WM_CLOSEQUERY then DoSomething()
     else break;
   end;

   Log('Exit');


так будёт лушше... горемычный ты мой... :)


Digitman   (2004-07-29 11:42:00) [12]


> Sasha73 ©   (29.07.04 10:45) [19]
> Пока меня Digitman пинал


и кто ж тебя, сироту, "пинал", а ?) что ж ты как ххххх в проруби-то ?)

нравится тебе Application - ну так и пользуй готовый подходящий цикл С ОЖИДАНИЕМ СООБЩЕНИЙ, реализованый Борландом в публичном метода Handlemessage ! Run() еще проще для организации цикла, но не подойдет тебе из-за того что ты отказываешься от формы в проекте ..Чего еще велосипед-то изобретать ? А потом жаловаться будешь, что некто Kurtevich, "приласкавший" тебя, горемычного, впарил тебе цикл, приведший к 100%-му CPU Usage твоим процессом ..


Sasha73   (2004-07-29 11:02:00) [13]

Не обращайте внимание на сообщение > Sasha73 ©   (29.07.04 10:45) [19]это я поспешил!
Розбираюсь!


Sasha73   (2004-07-29 10:45:00) [14]

Огромное спасибо за ответы > Kurtevich   (28.07.04 19:25) [16] !
Пока меня Digitmanпинал, я до этого уже сам дошел, но сообщений никаких не ловлю!
Сделал так:
    Log('Запуск удачный!');
    While True do begin
//       Application.ProcessMessages;
      if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
        if Msg.Message <> WM_QUIT then begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end
        else begin
          Log('Сообщение '+IntToStr(Msg.message)+'!');
          Break;
        end
      end
      else Log('Нет сообщений !');
    end;

{    repeat
          Application.HandleMessage;
          If Application.Terminated then Log('Exit');
    until Application.Terminated;}

    Log('Exit');


Kurtevich   (2004-07-28 19:30:00) [15]

да, вместо WM_??? конечно же надо вставить WM_CLOSEQUERY или как оно там называется anyway... я просто не знаю, это надо где-то посмотреть


Kurtevich   (2004-07-28 19:27:00) [16]

а Digitman-а этого ты не слушай - он любитель потрепаться и похвастаться своим превосходством над несчастными лузерами, а вот дельный совет дать его че-то ломит...


Kurtevich   (2004-07-28 19:25:00) [17]

без формы вобще все совсем не так сложно, и без ТАппликатион тоже... просто надо вызывать функцию виндовз: GetMessage или PeekMessage (как делает сама Дельфя), например... будет всего на пару строчек больше... кажись она может даже без окна работать...

вобщем делаешь так: берешь исходники vcl, находишь TApplication.ProcessMessage, и тупо дерешь оттудава все че те нада, с чуством спокойствия на душе оттого, что ты по сути ничего не меняешь по сравнению с вызовом сопственно ProcessFucksaggesss или whatever.... заодно посмотришь скока гавна эти подонки навешивают на невинные виндовские функции! :)

внимание, пример кода:

while not Quit do
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE)
   and Msg.Message <> WM_??? then QUIT := true;

 
всего делов-то... :)


Digitman   (2004-07-28 15:33:00) [18]


> на столько сложно?


да нет, не сложно

repeat
 Application.HandleMessage
until Terminated;


Sasha73   (2004-07-28 15:06:00) [19]

С OnCloseQuery и так понятно!
А без формы (вообще) все на столько сложно?


Digitman   (2004-07-28 14:52:00) [20]


> Sasha73 ©   (28.07.04 14:40) [12]


я не понимаю, чем вызвано твое упрямство и возражения против ГОТОВОГО выше приведенного кода ? зачем тебе эти подробности ? их изложение потянет на целую лекцию !

факт возбуждения события формы OnCloseQuery и есть ожидаемое тобой событие


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо