While GetMessage(Msg,0,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Как на WinAPI заменить компонент Timer?
Как на WinAPI заменить компонент Timer? Нужно чтобы определенное событие выполнялось 5 сек, но программа при этом не засыпала и не останавливалась, тобишь Sleep () не подходит. Спасибо.
см. ф-ю WinAPI SetTimer.
Код:
Цитата:
begin
if not CreateE2DWindow then begin
MessageBox(0, 'Невозможно создать окно.', 'Ошибка', MB_ICONSTOP);
Exit;
end;
if not E2DCreate then begin
DestroyWindow(E2DWindow);
Exit;
end;
while True do
if PeekMessage(E2DMsg, 0, 0, 0, PM_NOREMOVE) then
if not GetMessage(E2DMsg, 0, 0, 0) then
Break
else begin
TranslateMessage(E2DMsg);
DispatchMessage(E2DMsg);
end
else
if flgActive then
begin
OnIdle
end else
WaitMessage;
end.
if not CreateE2DWindow then begin
MessageBox(0, 'Невозможно создать окно.', 'Ошибка', MB_ICONSTOP);
Exit;
end;
if not E2DCreate then begin
DestroyWindow(E2DWindow);
Exit;
end;
while True do
if PeekMessage(E2DMsg, 0, 0, 0, PM_NOREMOVE) then
if not GetMessage(E2DMsg, 0, 0, 0) then
Break
else begin
TranslateMessage(E2DMsg);
DispatchMessage(E2DMsg);
end
else
if flgActive then
begin
OnIdle
end else
WaitMessage;
end.
Спасибо всем. Но как в даном примере использовать таймер. Ну хоть скромненький примерчик.
Поэтому и использование таймера, естественно, осуществляется через оконную роцедуру, которая получает все внешние сообщения, в том числе от таймера.
Зачем это может понадобиться в консольном приложении, не совсем понятно. А у тебя стиль написания соответствует именно консольному приложению, хотя, вроде, и создаются какие-то окна.
Сформулируй исходную задачу, может, тебе нужно совсем не то, что ты думаешь, а может, ты пытаещься применить для решения задачи неадекватные средства.
И еще, попытки скрестить часть функциональности Delphi и часть функциональности WinAPI зачастую приводят к непредсказуемому поведению программ, т.к. функции Delphi, как правило, представляют собой обертку для функций WinAPI, снабженную дополнительными переменными, которые нужно правильно инициализировать. Пытаясь работать в обход функциональности Delphi ты не производишь нужной инициализации переменных, из-за чего другие компоненты начинают работать неправильно, не совсем правильно или иногда неправильно.
Код:
var
TID:DWORD;
procedure TimerProc(Handle:HWND;uMsg:DWORD;idEvent:DWORD;dwTime:DWORD);stdcall;
begin
MessageBox(0,'1','2',0);
end;
...............................................
TID:=SetTimer(0,0,2000,@TimerProc);//2000 - время задержки в миллисекундах
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
TID:DWORD;
procedure TimerProc(Handle:HWND;uMsg:DWORD;idEvent:DWORD;dwTime:DWORD);stdcall;
begin
MessageBox(0,'1','2',0);
end;
...............................................
TID:=SetTimer(0,0,2000,@TimerProc);//2000 - время задержки в миллисекундах
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
Все работает! Спасибо ответившим. Особенно ahilles.