- Код: Выделить всё
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 секунду:
Как оказалось эта фича торможения программ ради нескольких, которые умеют с этим бороться (интересный метод разделения ресурсов компа - как винда, так и несчастье), обнаружилась ещё в десятке - чистой, без отключения дряни, просто без интернета

Что такое точность Sleep?
Функция Sleep в Windows задерживает выполнение потока на указанное количество миллисекунд. Однако на практике точность задержки может быть не идеальной из-за того, что Windows использует таймеры с фиксированной разрешением по умолчанию. Это может привести к тому, что задержка окажется больше или меньше ожидаемой. Виртуальные машины (VM) могут усугубить эту проблему, так как их таймеры могут быть ещё менее точными.
Использование TimeBeginPeriod
Функция TimeBeginPeriod позволяет устанавливать разрешение таймера на более низкое значение, что улучшает точность задержек. Однако это может повлиять на производительность системы, так как увеличивается частота переключения потоков. Кроме того, более высокое разрешение таймера может препятствовать включению системы в энергосберегающие режимы.
Пример использования TimeBeginPeriod:
- Код: Выделить всё
uses
Windows, mmsystem;
TimeBeginPeriod(1); // Устанавливаем разрешение таймера на 1 миллисекунду
TimeEndPeriod(1); // Возвращаем разрешение таймера по умолчанию
Не всё протестировал, но польза от этого кода есть.