Почему некорректно работает данный код ? По задумке кепшн формы должен обновляться каждую секунду, но на деле все не так. Как заставить этот код работать верно ?
ps нужна именно такая реализация: Интервал таймера очень маленький, в обработке таймера проверяется, если время, прошедшее от начала работы таймера делится на определенное число, необходимо произвести некоторые действия.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
start_time: Cardinal;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Interval := 1;
Timer1.Enabled := true;
start_time := GetTickCount;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
_now: Cardinal;
begin
_now := GetTickCount;
if (_now - start_time) mod 1000 = 0 then
Form1.Caption := IntToStr(_now - start_time);
end;
end.
У меня нормально отработал... (проверяла по системным часам и секундомеру на телефоне)
А в чем некорректность выражается?
Попробуй работать с QueryPerformanceCounter + TIME_CRITICAL для таких маленьких интервалов...
Добавлено через 2 мин.
У меня этот код обновляет кепш только каждые 7 секунд, то есть отображается 7000, потом 14000 ....
добавление Refresh что-то изменит?
TTimer - дико неточная вещь. Он работает через сообщения винды и потому его нельзя использовать на малых интервалов.
Для этого лучше создавать собственный thread и циклически вызывать Sleep(). Кроме того есть системные функции для таймеров высокой точности, но они тоже работают через нити.
Кстати, системные вызовы, навроде GetTickCount чертовски дороги (генерируют прерывание и вызывают переключение на ядро ОС). Почему изначально не поставить таймер на нужную задержку?