Как определить время с точностью до десятых секунды?
GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) "позволяет" определить с точностью до милисекунд, но врет - если создать список его результатов, тотам будут одинаковые значения на протяжении 0,15-0,16 сек, затем значение времени меняется, и иногда теряются даже десятые. Например 1,1...1,1...1,2...1,2...1,4...)
Для каких целей вам необходима информация с точностью до миллисекунд о системном времени?
Если вам это для математических вычислений, расчёта потраченного времени (разницы в интервалах) и т.п., то здесь лучше всего подходит таймер (кол-во тиков процессора), а не текущее время.
В системе явно задаются ограничения точности (это называется разрешением). Оно отдельно существует для функции таймера, и отдельно налагается на функции получения текущего времени, вроде GetSystemTime / GetLocalTime.
Кроме того это зависит от версии ОС (для таймера на XP, например это число около 10-15 мс., на Win7 - 1 мс.) и аппаратной конфигурации.
1. Таймер.
Используйте функции:
- QueryPerformanceCounter
- QueryPerformanceFrequency Пример на VB6.
А для снятия ограничения на разрешение можно воспользоваться недокументированной функцией NtSetTimerResolution (пример на C++).
Кроме того, необходимо учитывать, что у процессора могут быть собственные ограничения на максимально возможную разрешающую способность.
Вебкамера наблюдает за показаниями стрелок приборов, программа делает несколько снимков в секунду с окна вебкамерьі и сохраняет их под именами типа "2018.10.10 12-34-45 (1).bmp", "2018.10.10 12-34-45 (2).bmp",... Получается, что интервал времени между снимками теряется (єто поднадобится при построении графика), так же в дальнейшем может понадобиться время, когда сделан именно этот снимок а не соседний - текущее время. Может рядом с приборами положить секундомер, который тоже попадет в кадр, но сомневаюсь, что там будет видно.
Дело в том, что на выполнение программы и файловые операции тоже уходит время. И доли секунд здесь как раз имеют очень большую роль.
Могу предложить поставить на следящий комп Win8, убрать всю телеметрию, заблокировать обновления, отключить лишние сервисы, вообще оставить самый минимум.
Создать многопоточную программу. Один поток отвечает за получение кадра и присвоение метки времени (получение через GetSystemTimePreciseAsFileTime ), а второй - за запись на диск. Потоки не должны быть синхронизированы ожиданием. Ещё лучше открыть проекцию файла на память, писать несколько секунд в память, и затем через несколько секунд сбрасывать память на диск другим потоком.
Всем процессам, участвующим в этой процедуре, задать высокий приоритет.
Ну и разумеется сам процессор должен быть достаточно мощным.
Вы неправильно меня поняли, потоками нужно разделять не функцию получения системного времени, а времязатратные операции, такие как получение скриншота и запись на диск.
Вообще, у вас засечка времени в какой момент происходит до или после снятия скриншота?
И проблема у вас с чем связана, с несоответствием снимка реальному времени или с произвольными интервалами между снимками?
Ну, и для связи между двумя программами есть более цивилизованные и быстрые методы: сообщения, каналы, IPC, сокеты.
Реестр - это медленно и потребует механизма синхронизации. Без этого вы нарвётесь на исключение. Будет код 5.