metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2007-07-11 12:23 pm

Отличнейший баг

Откопал только что в проге сабж. Совершенно безумный.

Есть у меня в проге отображение прогресса для длинных операций. Чтобы его постоянно не обновлять, я вывожу изменения только через каждые 0.3 секунды. А проверяю это дело, использую функцию GetTickCount, сохраняя ее предыдущее значение и сравнивая с текущим. Если разница >300 то прогресс обновляется.

Оказалось, что комп на работе не выключался столько, что GetTickCount стал меньше нуля (использовался integer). И сей алгоритм сломался, т.е. прогресс перестал показываться вообще. Дома показывается, тут нет.

[identity profile] adews.livejournal.com 2007-07-11 10:13 am (UTC)(link)
А как-же сохранение энергии и забота об экологии? ;-)

[identity profile] eu3eu.livejournal.com 2007-07-11 10:20 am (UTC)(link)
А я пользую такой способ.
Результат DWORD-DWORD будет DWORD. Поэтому вычисление:

DWORD tstart = GetTickCount();
...
if ( ( GetTickCount() - tstart ) >= 300 ) ...

будет всегда нормально работать, даже, когда GetTickCount() перейдёт через ноль.

[identity profile] themech.livejournal.com 2007-07-11 11:02 am (UTC)(link)
это только старые программисты при имеющихся сейчас в наличии безумных объемах памяти экономят 2 байти на переменной? светлая память о 640 кБ ОЗУ? ;-)

[identity profile] mr-st.livejournal.com 2007-07-11 11:13 am (UTC)(link)
Знакомая штука.Правда мне задетектить его было проще т.к. клиент жаловся на заисание когда меняешь время. По тикам fps ограничивался.

[identity profile] 1ceheart.livejournal.com 2007-07-11 11:52 am (UTC)(link)
Ну это вообще классическая бага. Особенно на микроконтроллерах, где 32-битный счетчик особо не зафигачишь.

Поэтому, как справедливо заметил предыдущий оратор, if ((now - since) > 300) - работает всегда.

[identity profile] sbj-ss.livejournal.com 2007-07-11 01:42 pm (UTC)(link)
А просто обновлять прогрессбар каждые N операций религия не позволяет? :)

[identity profile] vp.livejournal.com 2007-07-11 01:59 pm (UTC)(link)
все то же самое, но разницу между прошлым и текущим значениями смотреть по модулю

[identity profile] eugene-ivanov.livejournal.com 2007-08-02 08:00 pm (UTC)(link)
помню, тоже подобный счётчик был. но там я ввёл проверку на переполнение, хотя время достижения оного было много-много лет ;) маньяк типа