Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
Sophos
86 / 63 / 2
Регистрация: 04.01.2010
Сообщений: 265
#1

Засечь время с точностью в миллисекунду

13.07.2012, 12:52. Просмотров 8455. Ответов 11
Метки нет (Все метки)

Необходимо отметить две временные точки и вычислить разницу между ними в миллисекундах.
Разница может быть от 20 мс и выше, так что необходима очень быстрая функция.

Что рассмотрел:

Get{Local,System}Time - Здорово, но возвращает результат в _SYSTEMTIME, который есть структура и просто так разницу в миллисекундах в нем не вычислишь.

Now - Круто, возвращает результат в Double (что в принципе ересь, но ладно) - но долго работает, ибо в своих кишках имеет GetLocalTime и перевод в цикле из _SYSTEMTIME в Double.

GetTickCount - Зависит от частоты процессора. И даже, если её знать теоретически она может меняться при параметрах энергосбережения.

Есть вообще в Delphi нормальные способы засекать время быстро и точно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2012, 12:52
Ответы с готовыми решениями:

График количество-время, где время разбито в несколько полей
Собсна, есть таблица с полями: День; Час; Минута; Количество; Все...

Нужно засечь время выполнения процедуры
писал вот код form1.timer.enabled:=true; search; ...

Клик мышки в заданное время с точностью миллисекундах
Пожалуйста, у меня просьба добрым программистам: Нужен мини программка с...

Определить время окончания рабочего дня зная время начала и продолжительность
Доброго времени! Помогите, пожалуйста, решить задачку в Delphi :help: Дело в...

Засечь время от начала одной операции до окончания другой
Такая задача- допустим юзер открывает файл, текстовый, который потом выводится...

11
Puporev
13.07.2012, 12:57
  #2

Не по теме:

Цитата Сообщение от Sophos Посмотреть сообщение
Засечь время с точностью в миллисекунду
Цитата Сообщение от Sophos Посмотреть сообщение
Есть вообще в Delphi нормальные способы засекать время быстро и точно?
Если бы было, то это бы было не Делфи, а атомные часы...

0
Sophos
86 / 63 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 12:59  [ТС] #3
Цитата Сообщение от Puporev Посмотреть сообщение
Если бы было, то это бы было не Делфи, а атомные часы...
Это почему вдруг? Приведенные мною выше способы позволяют получить точность в миллисекунду, но не подходят по другим причинам.
0
Puporev
Модератор
54361 / 41950 / 28980
Регистрация: 18.05.2008
Сообщений: 98,815
13.07.2012, 13:05 #4
Цитата Сообщение от Sophos Посмотреть сообщение
позволяют получить точность в миллисекунду
А Вы уверены что то что получается есть 1 млс?
0
Sophos
86 / 63 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:07  [ТС] #5
Цитата Сообщение от Puporev Посмотреть сообщение
А Вы уверены что то что получается есть 1 млс?
Не уверен, но в точность интервала 20 мс укладывается.
0
murderer
3318 / 1465 / 133
Регистрация: 06.10.2010
Сообщений: 3,217
13.07.2012, 13:18 #6
timeGetTime
0
Sophos
86 / 63 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:43  [ТС] #7
Цитата Сообщение от murderer Посмотреть сообщение
timeGetTime
Спасибо, но разрешение у него какое? Соответствует lpTimeIncrement из GetSystemTimeAdjustment?
0
murderer
3318 / 1465 / 133
Регистрация: 06.10.2010
Сообщений: 3,217
13.07.2012, 13:55 #8
Там же написано
You can use the timeBeginPeriod and timeEndPeriod functions to increase the precision of timeGetTime.
0
Sophos
86 / 63 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:57  [ТС] #9
Цитата Сообщение от murderer Посмотреть сообщение
You can use the timeBeginPeriod and timeEndPeriod functions to increase the precision of timeGetTime.
Мне такое не подойдет. Процесс, который будет делать отметки будет крутиться в фоне постоянно, а отдавать при этом большое количество ресурсов процессора и памяти только на то, чтобы повысить точность на 1-2 мс нецелесообразно.
0
murderer
3318 / 1465 / 133
Регистрация: 06.10.2010
Сообщений: 3,217
13.07.2012, 14:08 #10
Кажется ещё так можно
Delphi
1
milliseconds:=QueryPerformanceCounter/QueryPerformanceFrequency*0,001;
А про
Зависит от частоты процессора. И даже, если её знать теоретически она может меняться при параметрах энергосбережения.
MSDN отвечает
The frequency cannot change while the system is running.
Добавлено через 3 минуты
Сейчас заметил, что QueryPerformanceFrequency - это процедура. Ну короче ты понял идею.
0
Sophos
86 / 63 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 14:32  [ТС] #11
Цитата Сообщение от murderer Посмотреть сообщение
QueryPerformanceCounter
Идея не очень. Её "качество" отличается на разных операционках, процессорах, режимах работы: http://www.virtualdub.org/blog/pivot/entry.php?id=106
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
13.07.2012, 17:15 #12
Показания QueryPerformanceFrequency() всё-таки могут плавать при переходе процессора между различными режимами энергопотребления. Хотя Микрософт и утверждает обратное. Особенно это касается ноутбуков. Эта тема на разных форумах обсуждалась.
---
Пример применения QueryPerformanceFrequency() и QueryPerformanceCounter() :
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
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Fr, t1, t2 : Int64;
  Dt : Extended;
begin
  //Определяем тактовую частоту процессора (количество тактов в секунду).
  QueryPerformanceFrequency(Fr);
  if Fr = 0 then begin
    ShowMessage('Не удалось получить сведения о тактовой частоте.');
    Exit;
  end;
  ShowMessage('Тактовая частота процессора (количество тактов в секунду): ' + IntToStr(Fr));
 
  //Чтение показания счётчика тактов.
  QueryPerformanceCounter(t1);
 
  //Запуск исследуемого процесса.
  Sleep(5);
 
  //Показание счётчика тактов.
  QueryPerformanceCounter(t2);
  //Рассчёт времени.
  Dt := (t2 - t1) / Fr;
 
  ShowMessage('Длительность выполнения в секундах: ' + FloatToStr(Dt));
end;
---
Можно воспользоваться методом, который предложил murderer - с применением timeBeginPeriod() - timeGetTime() - timeEndPeriod().
0
13.07.2012, 17:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 17:15

Измерить время с точностью до сотой секунды без API
Доброго времени суток глубокоуважаемые форумчане. Задача однозначна,...

Засечь время
Как засечь время за которое выполняется процедура, или время выполнения...

Засечь время работы метода
Сделал метод в wolphram matematica 8.0 теперь преподаватель попросил сделать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru