Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизПроблема с таймером Найти похожие ветки
← →
incm (2005-09-08 19:19) [0]Есть:
hWnd := CreateWindow(sClassName, "", 0, 0, 0, 0, 0, 0, 0, hInstance, NIL);
tmr:=SetTimer(hWnd,1,20000,@OnTimer);
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
KillTimer(hWnd,tmr);
Проблема в том, что функция OnTimer вызывается два раза подряд при срабатываниии таймера. Чего бы это могло быть?
← →
Slym © (2005-09-09 09:19) [1]SetTimer(hWnd,1,20000,@OnTimer);
Может срабатывать через:
1. сообщение WM_TIMER: SetTimer(hWnd,1,20000,nil);
2. через CallBack функцию SetTimer(0,1,20000,@OnTimer);
ты используешь оба варианта
← →
incm (2005-09-09 11:40) [2]SetTimer(0,1,20000,@OnTimer) - срабатывает всеравно два раза!
SetTimer(hWnd,1,20000,nil) - вообще не срабатывает - я не делал обработку события WM_TIMER.
← →
alpet © (2005-09-09 13:39) [3]
uses windows;
{$APPTYPE CONSOLE}
procedure TimerProc (nID, uMsg, dwUser, dw1, dw2: DWORD);
var time: SYSTEMTIME;
begin
GetLocalTime (time);
WriteLn ("Event ", time.wHour, ":", time.wMinute, ":", time.wSecond);
end;
var msg: tagMSG;
tmr: DWORD;
begin
tmr := SetTimer(0,0,5000,@TimerProc);
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
KillTimer(0, tmr);
end.
По одному событию в 5 сек. Найди критическое отличие.
← →
incm (2005-09-09 13:49) [4]Я так понял, что использование таймера так: SetTimer(0,1,20000,@OnTimer), возможно только в консольной проге?
Но мне нужно создавать окно - у проги висит иконка в трее.
Т.е. в моем случае нужно только использовать обработку сообщения WM_TIMER ?
← →
alpet © (2005-09-09 13:58) [5]incm (09.09.05 13:49) [4]
Значит не правильно понял :) Тебе надо в параметры SetTimer поглядеть, в справке они описаны детально.
Вот скажем модификация тест для GUI приложения:
1. Директиву $APPTYPE CONSOLE надо убрать
2. Вот код callback функции:
procedure TimerProc (nID, uMsg, dwUser, dw1, dw2: DWORD);
var time: SYSTEMTIME;
t: Text;
begin
GetLocalTime (time);
AssignFile (t, "log.txt");
{$I-}
Append (t);
if IOresult <> 0 then ReWrite (t);
{$I+}
WriteLn (t, "Event ", time.wHour, ":", time.wMinute, ":", time.wSecond);
CloseFile (t);
end; // Timer Proc
Вместо цикла сообщений (while) вставляется:MessageBox (0, "Test", "Caption", MB_OK);
← →
Digitman © (2005-09-09 14:02) [6]
> Я так понял, что использование таймера так: SetTimer(0,1,20000,@OnTimer),
> возможно только в консольной проге?
неверно понял.
такое использование возможно в ЛЮБОЙ "проге".
> мне нужно создавать окно - у проги висит иконка в трее
на здоровье !
создавай хоть косой десяток окон - ничто этому не мешает и этио никак не связано с возможностями ф-ции SetTimer, которая позволяет отслеживать интервалы времени как при наличиии окон, так и в отсутствии оных в принципе
> в моем случае нужно только использовать обработку сообщения
> WM_TIMER ?
если ты указал hWnd заведомо существующего окна и указал последним параметром TimerProc = nil, то ты ОБЯЗАН обрабатывать сообщение WM_TIMER, ибо именно им таймер извещает тебя о наступлении события.
в противном случае (hWnd = 0 , TimerProc = адрес указанной тобой ф-ции) таймер при наступлении события не пошлет никакому окну сообщение WM_TIMER, вместо этого в момент alertable state потока, создавшего таймер, в его контексте будет вызвана та самая callback-ф-ция, адрес которой ты указал параметром TimerProc
← →
Игорь Шевченко © (2005-09-09 14:12) [7]Digitman © (09.09.05 14:02) [6]
> вместо этого в момент alertable state потока
В момент вызова функции DispatchMessage, если быть точным.
← →
Digitman © (2005-09-09 14:37) [8]
> Игорь Шевченко © (09.09.05 14:12) [7]
угу.
с alertable state это я загнул.
← →
incm (2005-09-09 16:02) [9]То есть если я обрабатываю сообщения, то CallBack-функции быть не должно, а функцию я должен вызывать по сообщению WM_TIMER ?
← →
Digitman © (2005-09-09 16:12) [10]
> incm (09.09.05 16:02) [9]
> есть если я обрабатываю сообщения, то
.. то ты их должен обрабатывать. Не более того.
О том , кто и как вызовет твой обработчик, беспокоиться не нужно : от тебя требуется лишь вовремя вызывать DispatchMessage()
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c