-
Нужно организовать запись лога в файл с данными таймера. Точность таймера должна быть до долей секунд (мс). К примеру так - 08.02.2018 22:39:55.100
Подскажите как это правильно организовать.
-
TimeToStr DateToStr
-
-
var Tm : _SYSTEMTIME; begin GetLocalTime(Tm); with Tm do Caption := Format('%02d.%02d.%02d %02d:%02d:%02d.%03d',[wDay,wMonth,wYear,wHour,wMinute,wSecond,wMilliseconds]);
-
В многозадачной ОС лог с такой точностью времени записи события смысла не имеет.
-
А я ещё раз повторю вопрос - "Зачем нужно в лог записывать время с точностью до долей секунд"? Если ОС Windows не является системой реального времени? После ответа на сей вопрос можно подумать и предложить какой-то реальный вариант.
-
-
> KilkennyCat © (11.02.18 13:55) [6] > > > > ОС Windows не является системой реального времени > > ни одна ос в такой детской постановке вопроса не является > ртос. > > что же касается именно "виндос не ртос" - https://www.youtube. > com/watch?v=A2irJ0bvVU0
А это уже не Windows, с которой работает ТС. И автору вопроса это не нужно.
-
> KilkennyCat © (11.02.18 13:55) [6] > > > > ОС Windows не является системой реального времени > > ни одна ос в такой детской постановке вопроса не является > ртос.
MSDOS уже забыл?
-
> И автору вопроса это не нужно.
Если автору это не нужно, то зачем вообще было упоминать о RTOS? То ртос, то не ртос... Автор указал доли секунд. Виндоус это может. О чем спорить?
-
> запись лога в файл с данными таймера. Точность таймера
Какого такого "таймера" и какая "точность"? У вас выполняется код. И вам периодически надо вывести некое сообщение в лог. А сообщение должно начинаться с префикса [%DATE%, %TIME%]. Ну и чего? Делаете например как-то так и всё:
const LogFormatSettings: TFormatSettings = ( DateSeparator: '-'; TimeSeparator: ':'; ShortDateFormat: 'yyyy/mm/dd'; LongDateFormat: 'yyyy/mm/dd'; ShortTimeFormat: 'hh:nn:ss.zzz'; LongTimeFormat: 'hh:nn:ss.zzz'; );
procedure TForm1.Button1Click(Sender: TObject); var LogDateTime: TDateTime; LogMessage: String; begin LogDateTime:=Now(); LogMessage:='Test'; ShowMessage(Format('[%s] %s', [DateTimeToStr(LogDateTime, LogFormatSettings), LogMessage])); end;
-
> kilkennycat © (12.02.18 03:21) [9] > > > > И автору вопроса это не нужно. > > Если автору это не нужно, то зачем вообще было упоминать > о RTOS? > То ртос, то не ртос... > Автор указал доли секунд. Виндоус это может. О чем спорить? >
О том что Виндоус много чего может, но никому ничем не обязан. Сообщение WM_TIMER действительно будет помещено в очередь сообщений окна строго через заданную долю секунды. Но вот когда оно будет обработано окном - это вопрос!
-
> Виндоус много чего может, но никому ничем не обязан.
Вообще-то именно обязан. Иначе программирования не было бы.
-
> KilkennyCat © (13.02.18 02:47) [12] > > > > Виндоус много чего может, но никому ничем не обязан. > > Вообще-то именно обязан. Иначе программирования не было > бы. >
По данной теме он обязан вовремя поместить сообщение в очередь сообщений окна. Но не более.
-
понятно. то есть, WM_TIMER - наше всё. несмотря на [2], на то что была речь про таймер, но не уточнялось какой, и даже не говорилось о событийности, что как-бэ дает возможность мыслить широко, мы ограничим себя догмой самого простенького таймерка.
-
> - точность системных часов(включая GetTickCount()) - по > умолчанию 1/64 секунды...
Т.е. GetTickCount возвращает +/- 1/64 секунды?
-
Удалено модератором
-
> Т.е. GetTickCount возвращает +/- 1/64 секунды?
- зависит от минимального(в системе) значения параметра timeBeginPeriod(), и от настроек/версии ОС(на каком-то сервере попадались и честные 1мс). и не +/-, а (GetTickCount()-GetTickCount()) - либо 0, либо >= 10..17 ссылку я уже приводил: ... If resolution of 10 to 16 milliseconds is sufficient, you can use GetTickCount64, QueryInterruptTime, QueryUnbiasedInterruptTime, KeQueryInterruptTime, or KeQueryUnbiasedInterruptTime to obtain time stamps that aren't synchronized to an external time reference. For UTC-synchronized time stamps, use GetSystemTimeAsFileTime or KeQuerySystemTime. If higher resolution is needed, you can use QueryInterruptTimePrecise, QueryUnbiasedInterruptTimePrecise, or KeQueryInterruptTimePrecise to obtain time stamps instead.там же - https://msdn.microsoft.com/ru-ru/library/windows/desktop/dn553408#AppendixA
-
Удалено модератором
-
мультимедийный таймер юзать надо
-
если в логах должно быть время, а на иконке таймера нарисованы часики, то это еще не значит, что для логов нужен таймер. каким бы мультимедийным он ни был.
|