Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1129976618
alexsis
2005-10-22 14:23
2005.11.13
Siemens M65


2-1129702622
Phoenix
2005-10-19 10:17
2005.11.13
Закрашивание строк в ListView


4-1126772390
SergeyGood
2005-09-15 12:19
2005.11.13
Функция CreateProcessWithLogonW


10-1107329735
Мыкола Бондаренко
2005-02-02 10:35
2005.11.13
WinFax Pro


4-1126693655
Still Swamp
2005-09-14 14:27
2005.11.13
Надо в CallBack API функции передать метод TObject





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский