Проблема с таймером

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 13 сен 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Устанавливаю таймер на определённое время для вызова сообщения (время вызова сообщения с точностью до минуты)
    Код (Text):
    1. invoke SetTimer,hWnd,10,1000,0
    2.  
    3. .
    4. .
    5. .
    6.  
    7. .elseif uMsg==WM_TIMER
    8.  
    9. проверка времени
    10.  
    11. .if eax==0 && timerflag!=1
    12.     invoke MessageBox,hwnd,addr msg,addr appname,MB_OK
    13.     mov    timerflag,1
    14. .endif
    timerflag1 для того, чтобы не вызывать сообщение более одного раза в течении назначеной минуты

    Проблема в том, что сообщения продолжают вызываться. В чём дело?
     
  2. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Может получается - ИЛИ ?
    Попробуй :
    .if eax==0
    .if timerflag ==1
    ;ничего не делаем
    .else
    ;что-то делаем
    .endif
    .endif
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    А зачем ставить такой маленький интервал, если код надо исполнить раз в минуту?
     
  4. asmeradm

    asmeradm New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    26
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Прикол этого куска в том, что мессажбокс УЖЕ висит (и не вернется из него, пока юзер не нажмет кнопку), а флаг ЕЩЕ не 1. Поэтому, если оно провисит до следующего тика, то будет еще один мессажбокс, потом еще, еще, еще... этаким косяком, по диагонали. А потом говорят, что винда глючит... :))
     
  6. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    vg

    FatMoon все правильно сказал. Пиши на VB - там событие таймера (не АПИшного, а контрола) не возникнет снова до тех пор, пока не отработает процедура его отработки... ;)
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Или использовать мультимедиа таймер, в нём можно одноразовое событие инициировать.
    А этот таймер начинает кидать события в очередь, что для твоего случая не хорошо.
    Прикол в том, что MessageBox сам обрабатывает сообщения (то есть у него есть цикл сообщений), и он не блокирует обработку других окон. Поэтому как ни странно, когда MessageBox висит, поток может выйти из него(посредством DefWindowProc), но не выйти из процедуры родительского окна и снова выполнить твою процедуру. То есть поток по кругу входит в обработчик WM_TIMER, но до mov timerflag,1 не как не дойдёт, но если нажать хоть один OK, то поток сразу дойдёт до твоего mov timerflag, 1, OOП концепции однако. Лечится ето есно очень просто, переносом mov timerflag,1 до MessageBox, и всё будет OK. Косяков при этом быть не должно даже если обработчик WM_TIMER, запаздает с первым вызовом, так как события WM_TIMER если они не обработаны, склеиваются. Но события всё равно будут кидаться, что не есть хороший стиль программирования, лучше юзать однособытийный мультимедия таймер.