Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Win32 API | Delphi | Странности с Winapi Timer (http://forum.oszone.net/showthread.php?t=56280)

Mavlyudov 08-11-2005 00:19 371335

Win32 API | Delphi | Странности с Winapi Timer
 
Еще возник такой вопрос. В модуле 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 373338

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

Mavlyudov 13-11-2005 03:05 373407

LeonidPr, напиши кусок кода. мне не очень понятно

LeonidPr 13-11-2005 13:57 373457

У меня нормально работает следующий код.

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 373671

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

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


Время: 07:05.

Время: 07:05.
© OSzone.net 2001-