![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не убивается таймер после цикла сообщений [D7, 95/98, XP]
NikIta88 © (2006-08-23 19:54:00)Всем привет! Создаю таймер в безоконном приложении (не консольном), создаю цикл для обработки сообщений,
но при перзагрузке/завершении работы Windows KillTimer не вызывается. Что я не правильно сделал?
program MyTimer;
uses
Windows, SysUtils, Dialogs;
procedure TimerProc (hw: HWND; uMsg,idEvent: Integer; dwTime: LongWord); stdcall;
begin
ShowMessage('TimerProc');
end;
var
TimerID: cardinal;
msg: TMsg;
begin
TimerID := SetTimer(0,0,10000,@TimerProc);
while GetMessage(msg,0,0,0) do DispatchMessage(msg);
{ этот код не выполняется }
ShowMessage('End Message loop');
if KillTimer(0,TimerID) then
ShowMessage('KillTimer: OK')
else
ShowMessage('KillTimer: ERROR');
end.
NikIta88 (2006-08-23 21:16:00) [1]Пожалуй оставлю все как есть, т.к программа все равно работает до перезагрузки/завершения
Всем спасибо!
Leonid Troyanovsky (2006-08-23 21:16:00) [2]
> NikIta88 © (23.08.06 20:25) [3]
> Но пучему цикл не завершается, если в MSDN написано, что
> GetMessage возвратит FALSE, если получит WM_QUIT?
А почему это оно должно получать WM_QUIT?
Если б у приложения было окно, то оно бы получило
WM_QUERYENDSESSION & WM_ENDSESSION.
Если б это была консоль, то она получило бы
CTRL_LOGOFF_EVENT & CTRL_SHUTDOWN_EVENT,
если б, конечно, озаботилась SetConsoleCtrlHandler.
Ну, а в противном случае, ничего, кроме вульгарного
терминирования, оно не заслужило.
--
Regards, LVT.
Пусик (2006-08-23 20:59:00) [3]Вообще-то у тебя таймер не использует оконную процедуру.
Ketmar (2006-08-23 20:49:00) [4]> [3] NikIta88 © (23.08.06 20:25)
а, так надо, чтобы завершалось, а не чтобы вызывалось? а сразу написать об этом? опять мастаки в гестапо играют...
может, ввести правило: перед задаванием вопроса каждому участнику форума автор обязан выслать по телепатору?
palva (2006-08-23 20:46:00) [5]Значит она не получает WM_QUIT. Вообще-то программа должна сама выдать PostQuitMessage, после того как аккуратно закроет всё с чем работала. То есть WM_QUIT должно исходить из вашей программы. Ловите в вашем цикле сообщение WM_DESTROY, и вызывайте при этом условии PostQuitMessage. Но пошлет ли система при выключении вашему безоконному треду WM_DESTROY тоже вопрос.
NikIta88 (2006-08-23 20:25:00) [6]Но пучему цикл не завершается, если в MSDN написано, что GetMessage возвратит FALSE, если получит WM_QUIT?
Anatoly Podgoretsky (2006-08-23 20:23:00) [7]что говорит GetLastError
Ketmar (2006-08-23 19:55:00) [8]мне даже лениво проверять, но: тебе это не даёт спать? всё равно винды переинициализируются, фиг с ним, с этим вызовом. ы?