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


Автор: MacTep 5.3.2006, 16:09
Нужно реализовать секундомер с точностью до сотых секунды. А вот как это сделать, не пойму. При помощи обыкновенного таймера не получается, как-то странно он тормозит. Какие есть предложения по этому вопросу?

Автор: Albinos_x 5.3.2006, 17:27
вопрос неоднакратно поднимался пользуемся поиском....
кроме того этот вопрос ели не ошибаюсь освещён в DRKB...

Автор: SoWa 5.3.2006, 20:36
GetTickCount- им и пользуйся.

Автор: MacTep 5.3.2006, 23:50
Цитата(SoWa @ 5.3.2006, 20:36 Найти цитируемый пост)
GetTickCount- им и пользуйся.
Пользуюсь... Но ведь при проверке того, сколько уже времени прошло, нужно сверяться с таймером. А таймер сильно отстает или неправильно идет вообще. Можно пример... В DRKB такой статьи я не нашел.

Автор: Albinos_x 6.3.2006, 00:19
Цитата(SoWa @ 5.3.2006, 20:36 Найти цитируемый пост)
GetTickCount- им и пользуйся.

как я понял человек хочет сделать собственный таймер...
---------
ну так создай отдельный поток и в нем проверяй GetTickCount, например:
Код

...
procedure Execute;
var t:Int64;
begin
t:=GetTickCount;
while GetTickCount>=(t+TimeOut) do  // TimeOut считаю за свойство потока, типа MyThead.TimeOut:Integer;
   begin
   t:=GetTickCount;
   // здесь твои операции
   end;
end;
...

Автор: Sunvas 12.3.2006, 02:28
Кстати, также в потоке можно функцию в While-ом, а в ней пользоваться процедурой Sleep. Как показывает практика, этот метод один из самый точных.

Автор: former 12.3.2006, 14:14
Для начала описываешь процедуру, которая будет вызываться по сообщению от таймера :

Код

procedure FNTimeCallBack(uTimerID, uMessage: UINT;
dwUser, dw1, dw2: DWORD); stdcall;
begin
  // Тело процедуры.
end;


а дальше в программе (например по нажатию кнопки) создаешь Таймер и вешаешь на него созданную процедуру

Код

uTimerID:=timeSetEvent(10,500,@FNTimeCallBack,100,TIME_PERIODIC); 


Подробности смотри в Help. Hу и в конце убиваешь таймер
Код

timeKillEvent(uTimerID); 



И все. Точность этого способа до 1 мсек. минимальный интервал времени можно задавать 1 мсек.

Обрати внимание на то, что все CALLBACK-функции, вызываемые Windows, должны использовать соглашение о вызовах stdcall.

Автор: MacTep 13.3.2006, 23:37
На torry.net нашел кучу полезных компонентов для работы со временем. Сразу проблема исчезла сама собой. Спасибо за обсуждение! smile

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