- Код: Выделить всё
- Uses sysutils;
 Var
 Q64,W64: INT64;
 Q2,W2: LONGINT;
 LABEL
 1,2;
 FUNCTION DSF: INT64;
 VAR
 MS : Comp;
 BEGIN
 MS:=TimeStampToMSecs(DateTimeToTimeStamp(Now));
 DSF:=TRUNC(MS);
 END;
 
 Begin
 Q64:=DSF;
 Q2:=0;
 1:
 W64:=DSF;
 IF Q64<>W64 THEN BEGIN
 WRITELN(W64);
 Q64:=W64;
 INC(Q2);
 IF Q2>1000 THEN GOTO 2;
 END;
 GOTO 1;
 2:
 End.
В линуксе результат нормальный, все числа увеличиваются строго на единицу, а в 11 (пока протестировал только из под vmware чтобы не перезагружаться) имеем такой разброс в выхлопе:
- Код: Выделить всё
- 63891009454648
 63891009454651
 63891009454652
 63891009454655
 63891009454657
 63891009454660
 63891009454661
 63891009454663
 63891009454665
 63891009454666
 63891009454669
 63891009454670
 63891009454672
 63891009454673
 63891009454676
 63891009454677
 63891009454678
 63891009454680
 63891009454683
 63891009454685
 63891009454688
 63891009454689
 63891009454691
 63891009454692
Вроде бы приложение в винде это как-то может сделать как в линуксе.
Добавлено спустя 11 часов 29 минут 21 секунду:
Как оказалось эта фича торможения программ ради нескольких, которые умеют с этим бороться (интересный метод разделения ресурсов компа - как винда, так и несчастье), обнаружилась ещё в десятке - чистой, без отключения дряни, просто без интернета
 Там разброс чисел был 15-16. Нашёл что нужно в программе подкручивать, чтобы программа работала нормально и в новых виндах, и рваное время не складывалось. Цитата исправленая для fpc:
 Там разброс чисел был 15-16. Нашёл что нужно в программе подкручивать, чтобы программа работала нормально и в новых виндах, и рваное время не складывалось. Цитата исправленая для fpc:Что такое точность Sleep?
Функция Sleep в Windows задерживает выполнение потока на указанное количество миллисекунд. Однако на практике точность задержки может быть не идеальной из-за того, что Windows использует таймеры с фиксированной разрешением по умолчанию. Это может привести к тому, что задержка окажется больше или меньше ожидаемой. Виртуальные машины (VM) могут усугубить эту проблему, так как их таймеры могут быть ещё менее точными.
Использование TimeBeginPeriod
Функция TimeBeginPeriod позволяет устанавливать разрешение таймера на более низкое значение, что улучшает точность задержек. Однако это может повлиять на производительность системы, так как увеличивается частота переключения потоков. Кроме того, более высокое разрешение таймера может препятствовать включению системы в энергосберегающие режимы.
Пример использования TimeBeginPeriod:
- Код: Выделить всё
- uses
 Windows, mmsystem;
 TimeBeginPeriod(1); // Устанавливаем разрешение таймера на 1 миллисекунду
 TimeEndPeriod(1); // Возвращаем разрешение таймера по умолчанию
Не всё протестировал, но польза от этого кода есть.




