metaclass: (Default)
[personal profile] metaclass
Откопал только что в проге сабж. Совершенно безумный.

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

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

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

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

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

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

Date: 2007-07-11 12:19 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Хехе, у меня там было более хитро. tstart назначался не всегда, в чем собственно и баг. Когда он был 0 и GetTickCount>0 - все работало. А когда GetTickCount cтал меньше нуля, все сломалось :)

Date: 2007-07-11 12:34 pm (UTC)
From: [identity profile] eu3eu.livejournal.com
Лично я стараюсь не пользовать типы со знаком там, где в этом нет надобности - в индексах, в счётчиках на инкремент.

Date: 2007-07-11 12:36 pm (UTC)
From: [identity profile] eu3eu.livejournal.com
А GetTickCount возвращает DWORD (unsigned long), зачем было делать каст в int?

Date: 2007-07-11 12:41 pm (UTC)
From: [identity profile] metaclass.livejournal.com
а, осталось от каких-то дико стародавних пор

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

Date: 2007-07-11 12:21 pm (UTC)
From: [identity profile] metaclass.livejournal.com
4 байта переменной с микросекундами. Винда так возвращает. 49 дней период, если целиком все диапазон, а если до минуса просто дожидаться - то и 24 дня.

Date: 2007-07-11 01:25 pm (UTC)
From: [identity profile] themech.livejournal.com
все понятно. в микрософте никогда не предполагали что винда может работать более 24 дней без перезагрузки ;-)

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

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

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

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

Date: 2007-07-11 02:01 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Операций может быть 10000 в секунду, а может быть 10 в секунду. Каждые N тут не покатит, если N не рассчитывать какими нибудь эвристическими методами. А вот 3 раза в секунду вполне прилично.

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

Date: 2007-07-11 02:01 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Юникс-вей запрещает обходить баги :)

Date: 2007-07-11 09:30 pm (UTC)
From: [identity profile] wlite.livejournal.com
GetTickCount64

Date: 2007-07-11 09:46 pm (UTC)
From: [identity profile] kkirsanov.livejournal.com
GetTickCount64 - подари бак потомкам! :)

Date: 2007-07-11 09:46 pm (UTC)
From: [identity profile] kkirsanov.livejournal.com
баг конечно же.

Date: 2007-07-11 10:08 pm (UTC)
From: [identity profile] wlite.livejournal.com
угу :)
кстати, по реквирементс оно тока на висте поедет, не считая самописного варианта с исходников ру
ну можно еще GetSystemTimes юзать. или еще что-нибудь более сложное, чтоб этот баг затмили другие.

Date: 2007-07-11 10:16 pm (UTC)
From: [identity profile] kkirsanov.livejournal.com
Кстати от таймерах.
Недавно боролся с глюками одной роботизированной хрени.
Там время мерили 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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 1st, 2025 12:08 am
Powered by Dreamwidth Studios