Отличнейший баг
Jul. 11th, 2007 12:23 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Откопал только что в проге сабж. Совершенно безумный.
Есть у меня в проге отображение прогресса для длинных операций. Чтобы его постоянно не обновлять, я вывожу изменения только через каждые 0.3 секунды. А проверяю это дело, использую функцию GetTickCount, сохраняя ее предыдущее значение и сравнивая с текущим. Если разница >300 то прогресс обновляется.
Оказалось, что комп на работе не выключался столько, что GetTickCount стал меньше нуля (использовался integer). И сей алгоритм сломался, т.е. прогресс перестал показываться вообще. Дома показывается, тут нет.
Есть у меня в проге отображение прогресса для длинных операций. Чтобы его постоянно не обновлять, я вывожу изменения только через каждые 0.3 секунды. А проверяю это дело, использую функцию GetTickCount, сохраняя ее предыдущее значение и сравнивая с текущим. Если разница >300 то прогресс обновляется.
Оказалось, что комп на работе не выключался столько, что GetTickCount стал меньше нуля (использовался integer). И сей алгоритм сломался, т.е. прогресс перестал показываться вообще. Дома показывается, тут нет.
no subject
Date: 2007-07-11 10:13 am (UTC)no subject
Date: 2007-07-11 10:20 am (UTC)Результат DWORD-DWORD будет DWORD. Поэтому вычисление:
DWORD tstart = GetTickCount();
...
if ( ( GetTickCount() - tstart ) >= 300 ) ...
будет всегда нормально работать, даже, когда GetTickCount() перейдёт через ноль.
no subject
Date: 2007-07-11 12:19 pm (UTC)no subject
Date: 2007-07-11 12:34 pm (UTC)no subject
Date: 2007-07-11 12:36 pm (UTC)no subject
Date: 2007-07-11 12:41 pm (UTC)no subject
Date: 2007-07-11 11:02 am (UTC)no subject
Date: 2007-07-11 12:21 pm (UTC)no subject
Date: 2007-07-11 01:25 pm (UTC)no subject
Date: 2007-07-11 11:13 am (UTC)no subject
Date: 2007-07-11 11:52 am (UTC)Поэтому, как справедливо заметил предыдущий оратор, if ((now - since) > 300) - работает всегда.
no subject
Date: 2007-07-11 01:42 pm (UTC)no subject
Date: 2007-07-11 02:01 pm (UTC)no subject
Date: 2007-07-11 01:59 pm (UTC)no subject
Date: 2007-07-11 02:01 pm (UTC)no subject
Date: 2007-07-11 09:30 pm (UTC)no subject
Date: 2007-07-11 09:46 pm (UTC)no subject
Date: 2007-07-11 09:46 pm (UTC)no subject
Date: 2007-07-11 10:08 pm (UTC)кстати, по реквирементс оно тока на висте поедет, не считая самописного варианта с исходников ру
ну можно еще GetSystemTimes юзать. или еще что-нибудь более сложное, чтоб этот баг затмили другие.
no subject
Date: 2007-07-11 10:16 pm (UTC)Недавно боролся с глюками одной роботизированной хрени.
Там время мерили GetTickCount.
Вот табличка замера времени выполнения Sleep(100) GetTickCount против QueryPerformanceCounter
GetTickCount: 94 ms QPC: 100.246 ms
GetTickCount: 110 ms QPC: 100.173 ms
GetTickCount: 93 ms QPC: 100.156 ms
GetTickCount: 110 ms QPC: 100.281 ms
GetTickCount: 93 ms QPC: 100.083 ms
GetTickCount: 110 ms QPC: 100.127 ms
GetTickCount: 94 ms QPC: 99.7211 ms
no subject
Date: 2007-08-02 08:00 pm (UTC)