powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Адекватный способ получить штамп времени
43 сообщений из 43, показаны все 2 страниц
Адекватный способ получить штамп времени
    #40013908
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть в моей библиотеке такая вещь как штамп времени
Долго я его выстрадывал. Там суть в том, чтобы в Int64 запихнуть высокоточный замер времени
И в POSIX это удаётся сделать просто, там есть функция clock_gettime, она достаточно быстрая и даёт точность до наносекунд

А в Windows появились сложности. Я вычитал, что GetSystemTimeAsFileTime работает очень быстро и имеет высокую точность (до 10й части микросекунды). Проблема началась тогда, когда я стал замерять дельту времени с помощью этого штампа. Оказалось, метод имеет такую же погрешность как и GetTickCount - в районе 15мс.

Код: pascal
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
program TimeStamp;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows,
  System.Diagnostics,
  System.SysUtils;

procedure Delay(const AMilliseconds: Cardinal);
var
  LStopwatch: TStopwatch;
begin
  LStopwatch := TStopwatch.StartNew;
  repeat
    System.YieldProcessor;
  until (LStopwatch.ElapsedMilliseconds >= AMilliseconds);
end;

function GetTime: Cardinal;
{begin
  Result := GetTickCount;
end;}
var
  LFileTime: TFileTime;
begin
  GetSystemTimeAsFileTime(LFileTime);
  Result := Round(Int64(LFileTime) * (1 / 10000));
end;

var
  T: Cardinal;
  Next: Boolean;
  TimeDelta, i: Integer;

begin
  try
    TimeDelta := 0;

    repeat
      Inc(TimeDelta);

      Next := False;
      for i := 1 to 30 do
      begin
        T := GetTime;
        Delay(TimeDelta);
        T := GetTime - T;
        if (T = 0) then
        begin
          Next := True;
          Break;
        end;
      end;
    until (not Next);

    Dec(TimeDelta);
    Writeln('Time delta: ', TimeDelta, 'ms');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  Write('Press Enter to quit');
  Readln;
end.



В итоге я не знаю, что делать под виндой. Было желание поиграться с QueryPerformanceCounter, но не совсем ясно, как его привязать к датам. Плюс лет 10 назад я сталкивался с проблемой, что в зависимости от ядра замер времени различался, получалось, что замер времени мог быть отрицательным.

Есть у кого-то опыт и мысли по решению задачи?
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013910
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.Diagnostics.TStopwatch.GetTimeStamp
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013912
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Так он и делает QueryPerformanceCounter
Только как ты этот штамп времени переведёшь в дату?
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013914
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходники посмотри.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013917
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

А ты сам то смотрел? )
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013929
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NtQuerySystemTime
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013933
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
NtQuerySystemTime

[NtQuerySystemTime may be altered or unavailable in future versions of Windows. Applications should use the GetSystemTimeAsFileTime function.]
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013934
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
NtQuerySystemTime

Хотя, нет. Не подойдёт.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013935
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Слушай, спасибо
Похоже это то, что нужно
А что у неё с поддержкой? Я так понял с Windows 2000?
Есть какая-то информация по производительности?
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013937
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

maybe yes, maybe no, maybe rain, maybe snow...
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013940
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Kazantsev Alexey
NtQuerySystemTime

[NtQuerySystemTime may be altered or unavailable in future versions of Windows. Applications should use the GetSystemTimeAsFileTime function.]


Бл*
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013944
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Штамп времени - неадекватная мысль сама по себе, так что способ его получения уже безразличен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013947
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
..
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013948
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Если бы это высказал кто-то другой, я бы даже не переспрашивал
Но так как это говоришь ты, я всё-таки спрошу
С чего такие мысли? )
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013967
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Точность до наносекунд на НЕ-рилтайм ОС - это желание странного.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013973
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

Ну мне до наносекунд и не нужна
Обычно нужна до миллисекунд. Но GetTickCount даёт большую погрешность
В целом вариант точности до микросекунд (1 / 1000000 секунды) с учётом UTC и возможностью перевести в локальное время - на мой взгляд весьма крутая штука. Практически это закрывает все задачи с таймингом. Будь то замер времени или логирование то же
Плюс это универсальный формат для разных ОС, можно передавать по сети

Кажется, я знаю как решить задачу для винды )
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013976
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Есть у кого-то опыт и мысли по решению задачи?
Мысль простая - забить.
Такая точность только на DSP достижима, и то не на всех.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013978
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесть, сколько тут людей, не верящих в собственные силы )
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013981
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUОбычно нужна до миллисекунд.

И вот тут вплывает "проблема XYZ" и
встаёт вопрос "для чего она нужна".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013982
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Обычно нужна до миллисекунд. Но GetTickCount даёт большую погрешность

Разрешение у NtQuerySystemTime и GetSystemTimeAsFileTime плавающее. Его можно изменить вызовами NtSetTimerResolution (теоретически, можно получить субмиллисекундное разрешение) и вызовом timeBeginPeriod(1) (разрешение 1 миллисекунда).
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013984
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я новичок?
Ну ок :)

Краткий ответ - для всего, где нужен тайминг :)

У меня что-то типа компании, совсем начинающей, я специализируюсь на Delphi. Иногда приходят задачи по доработке легаси проектов. Соответственно и библиотеки я пытаюсь разрабатывать таким образом, чтобы Delphi, начиная с 7 версии, поддерживался. Так вот когда я лепил бенчмарки, оказалось, что мой штамп времени для замера времени не подходит, поскольку имеет высокую погрешность. Пришлось лепить поверх System.Diagnostics.TStopwatch. Мелочь конечно, но неприятно.

У меня есть синхронизирующие примитивы. Там можно выставить таймаут. И считается он поверх таймштампа. Соответственно сейчас погрешность составляет 15 миллисекунд.

В скором времени буду переделывать логгер. Стандартное форматирование активно использует буферные строки, что на многопоточных приложениях приводит к блокировке. Получается если погрешность на логгере составляет 15 миллисекунд, значит на некоторых строках, особенно если логироваться из разных потоков, картина будет не соответствующая действительности.

Необходимость в UTC таймштампе с высокой точностью загрела давно. И под Posix этот вопрос решается на раз-два. Вопрос был в том, как добиться высокой точности и привязке к дате на винде. Если я похож на новичка, который не умеет задать вопрос, это конечно прикольно. Но ты то меня должен знать давно. Соответственно и ассоциаций таких быть не должно.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013986
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Я решил делать QueryPerformanceCounter с UTC-инкрементом. Спасибо, что прояснил ситуацию
Это была очень полезная информация
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013994
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU
Соответственно сейчас погрешность составляет 15 миллисекунд.
Т.е., грубо говоря, один квант процессорного времени, как и следовало предполагать.
Мне крайне любопытно, каким способом можно повысить точность если Винда решит, что в этот момент у нее есть более приоритетные задачи?
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНо ты то меня должен знать давно.

Именно это и заставило меня заподозрить, что ты маешься фигнёй. И ты это только что
подтвердил.

Бенчмарки приводятся к нужной точности удлинением мерной мили.

Синхронизирующие примитивы не требуют точных таймаутов. В них таймаут это нештатная
ситуация сам по себе. А таймаут поверх таймштампа даёт такие забавные глюки при
переполнении, что лучше вообще в эту сторону не смотреть.
Специальные случаи типа видеопроигрывателя или игрового движка решается специальными же
средствами класса ожидания вертикальной синхронизации и мультимедийными таймерами. Там
нужно не время, а промежуток от момента А до момента Б.

Логгеру вообще таймштампы нужны исключительно для косметики, а идентификация
последовательности событий решается сериализацией их записи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013997
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Ты не понял
Операция может занимать 14 мс
Но такой замер времени покажет 0

Вообще 1мс - это огромный промежуток времени для процессора
Можно несколько миллионов операций за это время провести
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40013998
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

А можно просто сделать штамп времени и не придумывать оправдания, почему он не нужен )
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014000
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU

Ты не понял
Операция может занимать 14 мс
Но такой замер времени покажет 0
Я то, как раз понял.
Более точную относительную величину времени выполнения (можно получить через QueryPerformance...), это никаких проблем не составляет.
Проблема возникает при попытке опереться на абсолютные времена, тут возникает планировщик задач винды и еще куча факторов.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014005
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

У тебя каша в голове
Абсолютные времена, не абсолютные времена
Я про одно говорю
Ты про другое
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014007
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема началась тогда, когда я стал замерять дельту времени с помощью этого штампа. Оказалось, метод имеет такую же погрешность как и GetTickCount - в районе 15мс.

У GetTickCount погрешность 15 мс - постоянная. А у функций запроса времени - зависит от текущего разрешения системного таймера. Если выставить разрешение в 1 мс, то будет значительно точнее.

Я решил делать QueryPerformanceCounter с UTC-инкрементом

QueryPerformanceCounter намного "тяжелее", в десятки раз дольше работает, по сравнению с GetTickCount.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014008
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU

У тебя каша в голове
Ты перескакиваешь с задачи старт-поста в замер времени выполнения операции, а каша в голове у меня.
Ну ладно.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014016
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пару недель тому столкнулся с похожим вопросом, пришел в итоге к

Код: pascal
1.
2.
3.
4.
5.
{$IFDEF MSWINDOWS}
  Result := timeGetTime;
{$ELSE}
  Result := TThread.GetTickCount;
{$ENDIF}



точность 2-4 мс, зависит от нагрузки. Мне хватает.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014018
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис,

Старт пост о штампе времени
Какой это штамп времени, если там погрешность 15мск
Порнография
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014020
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

У timeGetTime тоже плавающее разрешение. NtQueryTimerResolutionProc позволяет узнать допустимый диапазон и текущее значение. По дефолту - 15мсек. Некоторые версии дельфей вызывали timeBeginPeriod(1), поэтому если тестируешь на машине с такой версией, получишь разрешение в 1мсек, а на машине юзера всё может быть совсем не так.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014022
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такой вариант.

Код: pascal
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
type
  TPreciseTime = class(TObject)
  private
    FTimeType    : TTimeType;
    FInitDT      : TDateTime;
    FStart       : int64;
    FFreq        : int64;

    procedure SetTimeType(const Value: TTimeType);
    function GetDateTime: TDateTime;
    function GetDate: TDateTime;
    function GetTime: TDateTime;
  protected
    function InitTime : TDateTime;
  public
    constructor Create(ATimeType : TTimeType);
    property DateTime : TDateTime read GetDateTime;
    property Date : TDateTime read GetDate;
    property Time : TDateTime read GetTime;
    property TimeType : TTimeType read FTimeType write SetTimeType;
  end;

{ TPreciseTime }

constructor TPreciseTime.Create(ATimeType: TTimeType);
begin
  FTimeType := ATimeType;
  InitTime;
end;

function TPreciseTime.GetDate: TDateTime;
begin
  Result := DateOf(DateTime)
end;

function TPreciseTime.GetDateTime: TDateTime;
var _End : int64;
begin
  QueryPerformanceCounter(_End);
  Result := FInitDT + (((_End - FStart) * 1000) div FFreq) / 86400000.0;
end;

function TPreciseTime.GetTime: TDateTime;
begin
  Result := TimeOf(DateTime);
end;

function TPreciseTime.InitTime: TDateTime;
begin
  QueryPerformanceFrequency(FFreq);
  FInitDT := TimeUnit.GetDateTime(FTimeType);
  QueryPerformanceCounter(FStart);

  Assert(FStart <> 0, EPrecisionTimeInitTimeError);
  Result := FInitDT;
end;

procedure TPreciseTime.SetTimeType(const Value: TTimeType);
begin
  if FTimeType <> Value then begin
    FTimeType := Value;
    InitTime;
  end;
end;



...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014023
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Vizit0r,

У timeGetTime тоже плавающее разрешение. NtQueryTimerResolutionProc позволяет узнать допустимый диапазон и текущее значение. По дефолту - 15мсек. Некоторые версии дельфей вызывали timeBeginPeriod(1), поэтому если тестируешь на машине с такой версией, получишь разрешение в 1мсек, а на машине юзера всё может быть совсем не так.


ну, у полудесятков тестеров оказалась примерно такая же точность, поэтому я и не стал заморачиваться дальше.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014024
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Некоторые версии дельфей вызывали timeBeginPeriod(1)

До 10.3, если быть точным.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014042
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вывод: ставим timeBeginPeriod(1) и не паримся :) Главное вернуть при выходе из программы.
Никто никогда этого трюка не заметит. На производительность компьютера практически не влияет. У большинства юзеров, у который на компе стоят несколько программ, оно итак уже выставлено в "1".
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014053
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Kazantsev Alexey
Некоторые версии дельфей вызывали timeBeginPeriod(1)

До 10.3, если быть точным.


Вчера только купил новый комп, поставил Windows 10 Pro, D2007, новый эйдж, его кое-чего по мелочи. Сейчас проверил - D2007 при запуске выставляет разрешение таймера в 1, а после закрытия восстанавливает.
Брайзер эйдж периодически изменяет разрешение - то 1, то 16, видимо в зависимости от решаемых задач.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014182
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DmSer
Вывод: ставим timeBeginPeriod(1) и не паримся :) Главное вернуть при выходе из программы.
Никто никогда этого трюка не заметит. На производительность компьютера практически не влияет. У большинства юзеров, у который на компе стоят несколько программ, оно итак уже выставлено в "1".

Это ж ОС-глобальная шняга? А если потом запустится прога, которая вызовет timeBeginPeriod(10000)?

upd Ладно, МС предусмотрели этот случай, и берется минимум из всех заданных. Тогда сойдет
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014210
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Вывод: ставим timeBeginPeriod(1) и не паримся :) Главное вернуть при выходе из программы.

МС не рекомендует так делать.

Fr0sT-Brutal
А если потом запустится прога, которая вызовет timeBeginPeriod(10000)?

Больше допустимого максимума (NtQueryTimerResolution) установить не получится. У меня на машине максимум ~15мсек., минимум 0.5 мсек.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014499
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
DmSer
Вывод: ставим timeBeginPeriod(1) и не паримся :) Главное вернуть при выходе из программы.

МС не рекомендует так делать.


Но сама неоднократно так делала.

Почему для нас это прокатит:
1) мы разрабатываем в основном ПО для бизнеса;
2) нам нет смысла экономить пару процентов производительности компьютера клиента, которые никто не заметит;
3) скорее всего у клиента разрешение уже выставлено в 1, поскольку масса программ так делает.
4) разрешение в 1 мс даёт преимущества нашим программам, повышает точность логгирования времени, повышает точность работы циклов ожидания, основанных на Sleep(N) (где N меньше 16), в результате чего может улучшиться производительность (такие циклы есть в FastMM4, TMonitor.Enter).
5) ухудшение производительности затрагивает только системный планировщик, но это его проблемы, на наши программы негативно почти не влияет. Конечно, если доступно только одно ядро CPU, то может влиять существенно, но таких машин сейчас нет, а если есть, то на них доживает свой век WinXP.

Конечно, учащение срабатывания планировщика приводит к тому, что батарея ноутбука быстрее сядет, но это всего пара процентов.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014510
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Это затрагивает не только планировщик:
https://www.sql.ru/forum/1269119/pri-zapuske-delphi-umenshaetsya-vremya-otobrazheniya-vsplyvaushhego-menu-v-excell

В общем, если есть возможность так не делать, лучше не делать.
...
Рейтинг: 0 / 0
Адекватный способ получить штамп времени
    #40014649
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу поблагодарить всех за участие
Сейчас потестил под виндой и posix. Вроде всё норм

Для винды реализовал через QueryPerformanceCounter с инкрементом UTC. Перевод в Int64 заинлайнил на Си
Формат штампа решил сделать до микросекунд. Точность как на TStopwatch, только добавляется дата, работает в легаси и не тащит тяжёлые модули типа Classes, Variants

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure Test;
var
  D: TDateTime;
  T1, T2: TimeStamp;
begin
  T1 := TOSTime.UTCNow;
  Sleep(1000);
  T2 := TOSTime.UTCNow;

  D := TOSTime.ToDateTime(TOSTime.ToLocal(T1));
  Writeln(DateTimeToStr(D), ', second delta: ', T2 - T1, 'mcs');
end;



Код: sql
1.
2.
02.11.2020 23:40:36, second delta: 1000494mcs
Press Enter to quit



Кому интересно - постараюсь в течение месяца подготовить релиз, можно будет юзать
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Адекватный способ получить штамп времени
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]