-
ВладОшин © (13.01.19 12:26) [0]Даже не знаю куда, потому сюда
В отдельном потоке логирую всякое, в формате
Now + # + GetTickCount + # + всякое
Смотрю лог:
00:00:00 # X # бла-бла-бла1
00:00:00 # X+200 # бла-бла-бла2
00:00:01 # X+1100 # бла-бла-бла3
и т.п. - все нормально
вдруг (редко)
00:nn:00 # X # бла-бла-бла n
00:nn:07 # X # бла-бла-бла n+1
Т.е. что же получается, пока прошло 7 секунд, GetTickCount не сдвинулся ни на один тик?
ОС - виртуалка, win7
пишу в txt файл примитивно, сначала строка формируется, потом просто запись в конец -
Dimka Maslov © (13.01.19 12:46) [1]
> ОС - виртуалка
Всё что угодно может быть. Можно посоветовать вместо GetTickCount пользоваться rdtsc. -
Ну так отловить такое несложно. Потом дамп переменных посмотреть. Не?
А вообще без кода судить сложно. -
Styx © (13.01.19 13:19) [3]Может быть, семь секунд прошло между вызовами Now и GetTickCount? Поток тупо не выполнялся...
-
ВладОшин © (13.01.19 13:36) [4]>> вместо GetTickCount пользоваться rdtsc.
Спс, попробую
> Ну так отловить такое несложно. Потом дамп переменных посмотреть. Не?
Не. Редко бывает, очень редко
Код говорю же простой-
F_STREAM := TFileStream.Create(F_FN, fmOpenWrite or fmShareDenyWrite);
s := FormatDateTime('hh:mm:ss', now) + ' # ' + Inttostr(GetTickCount) + ' # ' + sLog + #13#10;
F_STREAM.Position := F_STREAM.Size;
F_STREAM.WriteBuffer(s[1], Length(s));
FreeAndNil(F_STREAM);
>> Может быть, семь секунд прошло между вызовами Now и GetTickCount?
может, наверное. Но странно как-то. То сутками - нормально, а то вдруг так..
-----
Да, важно.
Юзеры жалуются на тормоза и побеление экрана всей системы
По времени примерно совпадает, точно не уверен, потому что говорят типа "ну да, вроде как примерно тогда же я тыкала мышкой по всем программам - а ничего не происходило " -
Pavia © (13.01.19 15:40) [5]
> F_STREAM := TFileStream.Create(F_FN, fmOpenWrite or fmShareDenyWrite);
открывать файл надо 1 раз, при запуски программы, а не на каждый чих. -
ВладОшин © (13.01.19 15:45) [6]так и было
изменил недавно, чтобы быть уверенным, что записалось (не кэшируется ничего)
flushfilebuffer знаю, так дольше. Быстрее открывать на каждый чих. -
> ВладОшин © (13.01.19 13:36) [4]
>
> >> вместо GetTickCount пользоваться rdtsc.
> Спс, попробую
Для максимально точного логирования по времени действительно нужно использовать rdtsc. Для этого в Винде есть функции QueryPerformanceCounter и QueryPerformanceFrequency. Работают весьма неплохо.
Но думаю, что тебе, Влад, они не помогут.
Скорее всего твой поток перебивает другой поток с бОльшим приоритетом. Из-за этого и получается пауза в несколько секунд.