![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как культурно закрыть процесс ? [D6, Win2k]
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 и есть ожидаемое тобой событие