Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемка с TTimer, Сильно отстает отсчет времени 
:(
    Опции темы
quadro44
Дата 13.5.2008, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.5.2008

Репутация: нет
Всего: нет



Вот собственно она та проблема!
Вот небольшой кодец:
Код


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() я знаю, именно интересует в чем здесь может быть прикол.
PM MAIL   Вверх
pseud
Дата 13.5.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Код

 Timer1.Interval:= 10;


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


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

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

StartTime := Time;

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

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

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


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
ama_kid
Дата 13.5.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(quadro44 @  13.5.2008,  03:46 Найти цитируемый пост)
в чем здесь может быть прикол
Прикол в том, что таймер (работающий через системное сооющение WM_TIMER) - это низкоприоритетное сообщение, поэтому отправляется окну только, если нет других сообщений и вообще система не занята, следовательно очень сильно зависит от внешних факторов и для точного отсчета времени непригоден. Если надо отсчитывать точные промежутки времени - лучше воcпользоваться QueryPerformanceCounter. Ну и 10 мс - это все-таки слишком... система все равно не может гарантированно отмерить отрезок меньше 50 мс (ибо не RT-система)...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.