Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблемка с TTimer


Автор: quadro44 13.5.2008, 03:46
Вот собственно она та проблема!
Вот небольшой кодец:
Код


var
  msec, sec: integer;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled:= not Timer1.Enabled;

  if Button1.Caption = 'Start' then
    Button1.Caption:= 'Stop'
      else
        Button1.Caption:= 'Start';

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled:= False;
  Timer1.Interval:= 10;
  Button1.Caption:= 'Start';
  Button2.Caption:= 'Reset';
  msec:= 0;
  sec:= 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  s: string;
begin
  msec:= msec + 1;                 //За каждый проход увеличиваем значение миллисекунд на 1

  if msec = 100 then               //Если мсек равно 100 (100 * 10 = 1000 = 1сек)
  begin
    sec:= sec + 1;                 //Увеличиваем значение сек на 1
    msec:= 0;                      //Обнуляем мсек
  end;

  s:= inttostr(sec) + '.';         //В строку загоняем сначала значение секунд + сепаратор

  if msec < 10 then s:= s + '0';   //Если значение мсек меньше 10, то загоняем в строку еще нуль
                                   //например из 2мсек мы делаем 02мсек

  Edit1.Text:= s + inttostr(msec);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  msec:= 0;                         //Обнуляем все нафиг
  sec:= 0;
end;



Так вот.
Программа считает сколько прошло времени от нажатия кнопки Старт до ее повторного нажатия, что-то типа секундомера.
Реализовано с учетом сотых миллисекунд.
Но отсчет сильно отстает от того времени, которое показывает тот же Виндовс.
Значит, реально проходит 30 сек, а програ показывает только 19 с копеками, не может же такая быть погрешность.

Что примичательно на старой моей машине, Селерон 1200 на ХР Sp2, это работает на ура и погрешность небольшая, на уровне сотых.
А новой Core Quad  6600 на XP SP3 так тупит. Че за прикол.
Блин...

Може кто-сталкивался с такой проблемой.
О gettickcout() и getsystemtime() and getlocaltime() я знаю, именно интересует в чем здесь может быть прикол.

Автор: pseud 13.5.2008, 09:43
Код

 Timer1.Interval:= 10;


Цитата(quadro44 @  13.5.2008,  03:46 Найти цитируемый пост)
именно интересует в чем здесь может быть прикол.


прикола никакого нет, просто Timer у тебя не срабаытвает каждые 10 мсек.

лучше при Старте заводи переменную "время старта"
Код

StartTime := Time;

а какждое срабатывание Timera отображай разницу между временем сработки и временем старта
Код

Edit1.Text := TimeToStr(Time - StartTime);

да и таймер выставь хотя бы на 50 а лучше на 100 мс

Автор: ama_kid 13.5.2008, 09:54
Цитата(quadro44 @  13.5.2008,  03:46 Найти цитируемый пост)
в чем здесь может быть прикол
Прикол в том, что таймер (работающий через системное сооющение WM_TIMER) - это низкоприоритетное сообщение, поэтому отправляется окну только, если нет других сообщений и вообще система не занята, следовательно очень сильно зависит от внешних факторов и для точного отсчета времени непригоден. Если надо отсчитывать точные промежутки времени - лучше воcпользоваться http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx. Ну и 10 мс - это все-таки слишком... система все равно не может гарантированно отмерить отрезок меньше 50 мс (ибо не RT-система)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)