Конференция "Прочее" » Now, GetTickCount, странности логирования
 
  • ВладОшин © (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.
  • dmk © (13.01.19 12:46) [2]
    Ну так отловить такое несложно. Потом дамп переменных посмотреть. Не?
    А вообще без кода судить сложно.
  • 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 знаю, так дольше. Быстрее открывать на каждый чих.
  • Германн © (14.01.19 02:41) [7]

    > ВладОшин ©   (13.01.19 13:36) [4]
    >
    > >> вместо GetTickCount пользоваться rdtsc.
    > Спс, попробую

    Для максимально точного логирования по времени действительно нужно использовать rdtsc. Для этого в Винде есть функции QueryPerformanceCounter и QueryPerformanceFrequency. Работают весьма неплохо.
    Но думаю, что тебе, Влад, они не помогут.
    Скорее всего твой поток перебивает другой поток с бОльшим приоритетом. Из-за этого и получается пауза в несколько секунд.
 
Конференция "Прочее" » Now, GetTickCount, странности логирования
Есть новые Нет новых   [102299   +19][b:0.001][p:0.002]