Время с точностью до десятых секунды

Сергій

Активный пользователь
Сообщения
362
Симпатии
193
Баллы
123
#1
Как определить время с точностью до десятых секунды?
GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) "позволяет" определить с точностью до милисекунд, но врет - если создать список его результатов, тотам будут одинаковые значения на протяжении 0,15-0,16 сек, затем значение времени меняется, и иногда теряются даже десятые. Например 1,1...1,1...1,2...1,2...1,4...)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,785
Баллы
588
#2
Здравствуйте!

Для каких целей вам необходима информация с точностью до миллисекунд о системном времени?

Если вам это для математических вычислений, расчёта потраченного времени (разницы в интервалах) и т.п., то здесь лучше всего подходит таймер (кол-во тиков процессора), а не текущее время.
В системе явно задаются ограничения точности (это называется разрешением). Оно отдельно существует для функции таймера, и отдельно налагается на функции получения текущего времени, вроде GetSystemTime / GetLocalTime.
Кроме того это зависит от версии ОС (для таймера на XP, например это число около 10-15 мс., на Win7 - 1 мс.) и аппаратной конфигурации.

1. Таймер.

Используйте функции:
- QueryPerformanceCounter
- QueryPerformanceFrequency
Пример на VB6.
А для снятия ограничения на разрешение можно воспользоваться недокументированной функцией NtSetTimerResolution (пример на C++).
Кроме того, необходимо учитывать, что у процессора могут быть собственные ограничения на максимально возможную разрешающую способность.

Детальнее об этих функциях можно почитать в статье Марка Руссиновича: Sysinternals Freeware - Inside Windows NT High Resolution Timers
Увидеть текущее разрешение таймера можно, выполнив в консоли программу ClockRes: ClockRes - Windows Sysinternals
Стоит учитывать, что эти функции имеют рассинхронизацию при работе на разных потоках и ядрах процессора.

2. Получение текущего времени

Получить его в высоком разрешении можно только в Win 8 и выше.
Для этого воспользуйтесь функцией GetSystemTimePreciseAsFileTime
 
Последнее редактирование:

Сергій

Активный пользователь
Сообщения
362
Симпатии
193
Баллы
123
#3
Вебкамера наблюдает за показаниями стрелок приборов, программа делает несколько снимков в секунду с окна вебкамерьі и сохраняет их под именами типа "2018.10.10 12-34-45 (1).bmp", "2018.10.10 12-34-45 (2).bmp",... Получается, что интервал времени между снимками теряется (єто поднадобится при построении графика), так же в дальнейшем может понадобиться время, когда сделан именно этот снимок а не соседний - текущее время. Может рядом с приборами положить секундомер, который тоже попадет в кадр, но сомневаюсь, что там будет видно.
 

akok

Команда форума
Администратор
Сообщения
15,793
Симпатии
12,727
Баллы
2,203
#4
Важно
Пожалуйста, переключай раскладку, а то "ьі" не куда не лезет
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,785
Баллы
588
#5
затем значение времени меняется, и иногда теряются даже десятые. Например 1,1...1,1...1,2...1,2...1,4...)
Дело в том, что на выполнение программы и файловые операции тоже уходит время. И доли секунд здесь как раз имеют очень большую роль.

Могу предложить поставить на следящий комп Win8, убрать всю телеметрию, заблокировать обновления, отключить лишние сервисы, вообще оставить самый минимум.
Создать многопоточную программу. Один поток отвечает за получение кадра и присвоение метки времени (получение через GetSystemTimePreciseAsFileTime ), а второй - за запись на диск. Потоки не должны быть синхронизированы ожиданием. Ещё лучше открыть проекцию файла на память, писать несколько секунд в память, и затем через несколько секунд сбрасывать память на диск другим потоком.
Всем процессам, участвующим в этой процедуре, задать высокий приоритет.
Ну и разумеется сам процессор должен быть достаточно мощным.
 
Последнее редактирование:

Сергій

Активный пользователь
Сообщения
362
Симпатии
193
Баллы
123
#6
Мне ж всего лишь до десятых секунды. Или проще положить под вебкамеру и секундомер? Но секундомер на телефоне дает розмытые изображения десятых.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,785
Баллы
588
#7
Вам решать. Мне было бы проще написать многопоточную программу на C++.
 

Сергій

Активный пользователь
Сообщения
362
Симпатии
193
Баллы
123
#8
Вам решать. Мне было бы проще написать многопоточную программу на C++.
А если такая программа (децисекундомер) с максимальным приоритетом оставляет значение времени в реестре, и любая другая программа может его прочитать?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,785
Баллы
588
#9
Вы неправильно меня поняли, потоками нужно разделять не функцию получения системного времени, а времязатратные операции, такие как получение скриншота и запись на диск.
Вообще, у вас засечка времени в какой момент происходит до или после снятия скриншота?
И проблема у вас с чем связана, с несоответствием снимка реальному времени или с произвольными интервалами между снимками?

Ну, и для связи между двумя программами есть более цивилизованные и быстрые методы: сообщения, каналы, IPC, сокеты.
Реестр - это медленно и потребует механизма синхронизации. Без этого вы нарвётесь на исключение. Будет код 5.
 
Сверху Снизу