Войти

Показать полную графическую версию : Win32 API | Delphi | Странности с Winapi Timer


Mavlyudov
08-11-2005, 00:19
Еще возник такой вопрос. В модуле mmsystem есть функция TimeSetEvent
Я пишу процедуру типа таймера. Вот, что получается

procedure FnTimerCallBack(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
begin
showmessage('');
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
timeSetEvent(5000, 0, @FnTimerCallBack, 0, TIME_PERIODIC);
end;

Т.е после нажатия на кнопку, через 5 сек появляется сообщение.
У меня два вопроса
1) Почему форма появляется не сразу, а с задержкой(~2сек)?.
В то время как, если закоментировать строчку в обработчике кнопки
(//TimeSetEvent(5000, 0, @FnTimerCallBack, 0, TIME_PERIODIC); )
Форма появится сразу.
2) Как только средствами сделать, чтобы сначала появлялась заставка, а потом(через N секунд) окно? Заставкой может быть картинка. Окно создал так: CreateWindowEx... (короче зарегестрировал класс и дальше как обычно...)

LeonidPr
12-11-2005, 20:11
Попробуй вместо TIME_PERIODIC использовать TIME_ONESHOT. И ещё, убей событие таймера в FnTimerCallBack. Для этого надо сохранить значение, возвращаемое функцией timeSetEvent - идентификатор таймера, а затем в FnTimerCallback после обработки вызови timeKillEvent для этого идентификатора (timeKillEvent(TimerID)).

Mavlyudov
13-11-2005, 03:05
LeonidPr, напиши кусок кода. мне не очень понятно

LeonidPr
13-11-2005, 13:57
У меня нормально работает следующий код.

var
Form1: TForm1;
TimerID:MMRESULT;
implementation

{$R *.DFM}

procedure TimeProc(uID,uMsg:UINT;dwUser,dw1,dw2:DWORD);stdcall;
begin
ShowMessage('Hello');
timeKillEvent(TimerID);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TimerID:=timeSetEvent(5000,5000,TimeProc,0,TIME_ONESHOT);
end;

pva
14-11-2005, 10:10
1. Вообще-то, если не нужно большой точности таймера, то функциями TimeXXX пльзоваться не рекомендуется. Они достаточно тяжёлые.
Отличие от SetTimer и GetTickCount в том, что в windows 9x они имеют разрешение ~18 мс. В windows NT и далее разрешение всех таймеров (кроме счётчика квантов, который 10 нс.) 1 мс. Поэтому, воспользуйтесь лучше классом TTimer (он использует SetTimer).

2. Чтобы окно появлялось сразу, сделайте UpdateWindow (сразу после Show)




© OSzone.net 2001-2012