1 / 1 / 0
Регистрация: 25.11.2007
Сообщений: 15

Как написать точный таймер?

21.12.2007, 17:12. Показов 15429. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите! подскажите как написать точный таймер, а то у меня то 2 секунды отставания то вперед таймер бежит.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2007, 17:12
Ответы с готовыми решениями:

Ошибка в неточном поиске и как сделать точный поиск
База сделана в databasedesktop paradox Здравствуйте вот ошибка 'Invalid use of key word.Token:Института Line Number:2' Вот код: ...

Как определить точный размер оперативной памяти?
Приветствую. Есть функция: function GetMem: String; var MyMem: TMemoryStatus; begin MyMem.dwLength:=SizeOf(MyMem); ...

Очень точный таймер
Помогите пожалуйста. Мне нужно сделать очень точный таймер. Стандартный не подойдет - если комп тормознет, то и показания будут неточными. ...

18
 Аватар для 4erep_88
22 / 4 / 3
Регистрация: 18.07.2007
Сообщений: 169
22.12.2007, 14:47
Компонент Timer (вкладка System) пробовал?
0
 Аватар для LastSoul
7 / 9 / 10
Регистрация: 22.08.2006
Сообщений: 378
23.12.2007, 00:13
Цитата Сообщение от 4erep_88 Посмотреть сообщение
Компонент Timer (вкладка System) пробовал?
все что могу сказать - TTimer не совсем точно время дает... по крайней мере насколько я слышал
0
 Аватар для Ядовитый
7 / 7 / 4
Регистрация: 17.02.2007
Сообщений: 165
28.12.2007, 12:25
ты никак точный таймер в винде не реализуешь, так как это возможно только в ОС жёсткого реального времени.
Венда является ОС мягкого реального времени, чем и объясняется "плавание" твоего времени.
З.Ы. В таймере период меньше 10 мс ставить не имеет смысла, так как длительность тика в Windows 10 мс.
0
1 / 1 / 0
Регистрация: 25.11.2007
Сообщений: 15
29.12.2007, 18:18  [ТС]
Вообщем я таймер пробовал(с самого начала) и вроде сделал ,замерял 5 минут - точ в точ .
Интервал 1000 и ...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  sec := sec + 1;
  if sec = 60 then
    begin
      min := min + 1;
      sec := 0;
    end;
  if min = 60 then
    begin
      hour := hour + 1;
      min := 0;
    end;
  if hour = 24 then hour := 0;
 
  if sec < 10 then
    Label3.Caption := '0' + IntToStr(sec)
  else
    Label3.Caption := IntToStr(sec);
 
  if min < 10 then
    Label2.Caption := '0' + IntToStr(min)
  else
    Label2.Caption := IntToStr(min);
 
  if hour < 10 then
    Label1.Caption := '0' + IntToStr(hour)
  else
    Label1.Caption := IntToStr(hour);
end;
Токо вот в чем проблема препод не принял ,говорит надо с системным времнем сверяться .....
0
Человек
 Аватар для mustardandrew
97 / 82 / 7
Регистрация: 16.06.2009
Сообщений: 229
29.12.2009, 20:07
Так тебе нужно использовать функции
Time(), DecodeTime()
Delphi
1
2
3
4
5
var t:TTime;
    Hour, Min, Sec, MSec: Word;
begin
  t := Time();
  DecodeTime(t, Hour, Min, Sec, MSec);
Добавлено через 2 минуты
Да и еще, TTimer не плохо работает если интервал большой, но если интервал маленький идет погрешность в обе сторони.
0
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
29.12.2009, 23:46
делаешь так:
выставляешь объект TTimer на 1000 (это примерно 1 секунда)
в обработчике TTimer пишешь
Delphi
1
2
t := Time();
 DecodeTime(t, Hour, Min, Sec, MSec);
предварительно определив переменные
Delphi
1
2
var t:TTime;
    Hour, Min, Sec, MSec: Word;
ну... и если надо - выводишь.
хотя вывод без декодирования есть такой label1.caption:=timetostr(time());

и раз в секунду будешь получать системное время
я такое использовал в строке статуса)
0
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
31.12.2009, 12:10
Точный таймер в винде не проблема. Писал давно компонент на эту тему. Идея очень не новая. Если нужно пишите, вышлю код. Или постану прямо сюда, чтобы не писали Вам, что это нереализуемая задача )
0
Leksty
04.01.2010, 14:33
Выложите пожалуйста код точного таймера?
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
07.01.2010, 12:16
Лучший ответ Сообщение было отмечено как решение

Решение

По просьбе трудящихся

Как уже говорил, задумка не новая, просто я оформил решение в виде компонента. Очень удобно получилось, пользуйтесь

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
unit HRTimer;
 
{
  Author: Medvedev D. V.
  Company: IVC
}
 
interface
 
uses Windows, Classes, Forms, SysUtils;
 
type
 
  THRTimer = class;
 
  // отдельный поток для нашего таймера
  TTimerThread = class(TThread)
  private
    { Private declarations }
    FOwner: THRTimer;
  protected
    procedure Execute; override;
  end;
 
  // сам таймер
  THRTimer = class(TComponent)
  private
    FInterval: Double;
    FOnTimer: TNotifyEvent;
    FStartTime: Double;
    FClockRate: Double;
    FExists: Boolean;
    FEnabled: Boolean;
    FThread: TTimerThread;
    FPriority: TThreadPriority;
    procedure SetEnabled(Value: Boolean);
    procedure SetInterval(const Value: Double);
    procedure SetPriority(const Value: TThreadPriority);
  public
    constructor Create(AOwner: TComponent); override;
    function ReadTimer: Double;
  protected
    function StartTimer: Boolean;
    procedure Timer; virtual;
  published
    property Exists: Boolean read FExists;
    property Enabled: Boolean read FEnabled write SetEnabled;
    property Interval: Double read FInterval write SetInterval;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
    property Priority: TThreadPriority read FPriority write SetPriority;
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('MDV', [THRTimer]);
end;
 
// THRTimer
procedure THRTimer.SetEnabled(Value: Boolean);
begin
  if FEnabled = Value then Exit
  else FEnabled := Value;
 
  if FEnabled then  // включили таймер
  begin
    StartTimer;
    FThread := TTimerThread.Create(false);
    FThread.FOwner := Self;
    FThread.FreeOnTerminate := true;
    FThread.Priority := FPriority;
  end else          // выключили таймер
    FThread.Terminate;
end;
 
procedure THRTimer.SetInterval(const Value: Double);
begin
  if FInterval <> Value then
  begin
    if Enabled then
    begin
      Enabled := False;
      FInterval := Value;
      Enabled := True;
    end else
      FInterval := Value;
  end;
end;
 
procedure THRTimer.Timer;
begin
  if not (csDesigning in ComponentState) then
    if Assigned(FOnTimer) then FOnTimer(Self);
end;
 
constructor THRTimer.Create(AOwner: TComponent);
var
  QW: Int64;
begin
  inherited Create(AOwner);
  FExists := QueryPerformanceFrequency(QW);
  FClockRate := QW;
  FEnabled := false;
  FInterval := 1000;
  FPriority := tpNormal;    
end;
 
function THRTimer.StartTimer: Boolean;
var
  QW: Int64;
begin
  Result := QueryPerformanceCounter(QW);
  FStartTime := QW;
end;
 
function THRTimer.ReadTimer: Double;
var
  ET: Int64;
begin
  QueryPerformanceCounter(ET);
  Result := 1000.0 * (ET - FStartTime) / FClockRate;
end;
 
// TTimerThread
procedure TTimerThread.Execute;
var
  StartT: Double;        // начальное время отсчёта
  TickCounter: Integer;  // количество "тиков" таймера
begin
  TickCounter := 1;
  StartT := FOwner.ReadTimer;
  // пока не завершили поток или программу
  while not (Terminated or Application.Terminated) do
  begin
    if (FOwner.ReadTimer - StartT) >= FOwner.FInterval * TickCounter then
    begin
      Synchronize(FOwner.Timer);
      Inc(TickCounter);
    end;
  end;
end;
 
procedure THRTimer.SetPriority(const Value: TThreadPriority);
begin
  if FPriority <> Value then
    FPriority := Value;
end;
 
end.
3
 Аватар для amaroktmb
9 / 9 / 0
Регистрация: 03.01.2010
Сообщений: 28
08.01.2010, 20:48
вот написанный код точного таймера. сведения о разработчике находятся в файлах с кодом
Вложения
Тип файла: rar Timers.rar (6.5 Кб, 446 просмотров)
0
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 31
19.08.2015, 20:43
Как им пользоваться?
0
19.08.2015, 21:47

Не по теме:

Цитата Сообщение от karakulx Посмотреть сообщение
Как им пользоваться?
А смысл ?
Откровения от МедведЯ - всего лишь банальная вариация на тему "таймер высокого разрешения[/U], а не "точный таймер"

А вот к Ядовитому стоит прислушаться посерьезней, чем к МедведЮ)

0
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 31
20.08.2015, 00:06
Какую ос жесткого реального времени можно без головной боли поставить?и чтоб читала программы exe.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
20.08.2015, 01:20
Цитата Сообщение от karakulx Посмотреть сообщение
Какую ос жесткого реального времени можно без головной боли поставить?и чтоб читала программы exe.
Никакую. Точный таймер нужен только при работе с внешними для ПК устройствами. Внешними устройствами и нужно реализовывать такие таймеры.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.08.2015, 09:38
Цитата Сообщение от karakulx Посмотреть сообщение
Какую ос жесткого реального времени можно без головной боли поставить?и чтоб читала программы exe
MS DOS)
0
0 / 0 / 0
Регистрация: 19.08.2015
Сообщений: 31
20.08.2015, 21:49
mss, Если можно пж ссылочку,он будет поддерживать интернет?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.08.2015, 22:03
Цитата Сообщение от karakulx Посмотреть сообщение
пж ссылочку
Ссылочка

)
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
21.08.2015, 01:05
Цитата Сообщение от karakulx Посмотреть сообщение
будет поддерживать интернет?
Не будет. Он давно умер.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2015, 01:05
Помогаю со студенческими работами здесь

Точный таймер для C++
Здравствуйте. Такой вопрос. Я с помощью API некой высокоскоростной GigE камерой управляю GPIO. Решил реализовать UART на тех GPIO (эл....

Как написать свой таймер?
Чтобы функция выполнялась скажем каждые 200 миллисекунд. Сейчас WM_TIMER делает это, но он не подходит. Искал по многим запросам в гугле и...

Как правильно написать таймер
Всем доброго времени суток, подскажите начинающему как правильно реализовать таймер, как правильно написать код...

как написать таймер на 5 сек с привязкой к событию
В корневом каталоге сайта есть папка text, а в ней текстовый файл text.txt в котором появляется строка (к примеру-(привет, как дела ?))....

Как написать таймер что бы отчитывал дни до нового года
Как написать таймер что бы отчитывал до нового года при нажатии: 1 - полностью 2 - месяца 3 - дни 4 - часы 5 - минуты 6 -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru