Помогите с таймером

Тема в разделе "WASM.WIN32", создана пользователем xSoft, 28 ноя 2006.

  1. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    Всем привет!

    Итак, есть таймер и его обработчик. Таймер включается через timeSetEvent, а обработчик получая управление берет кое-что из памяти и уходит с этим еще кое-куда. Так вот если где-то там происходит задержка, то прога вылетает нафиг... Почему? Как с этим бороться?

    Спасибо :)
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Надо кое-что кое-где кое-как пофиксить.
     
  3. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    Разумеется :) Что именно?
     
  4. Nilos

    Nilos New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    14
    Может "кое-куда" в отдельный поток засунуть?
     
  5. Nilos

    Nilos New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    14
    Возможно, во время задержки таймер срабатывает еще раз? Тогда надо его запретить на время выполнения процедуры "кое-куда".
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Nilos
    Таймер не может сработать ещё раз, если обработчик ещё не вернул управление с прошлого раза.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    2Quantum
    Так xSoft даже не указал что у него за таймер, ось и т.д(может у него многопоточный таймер).
    Какой-то таймер, кое-где, кое-что, кое-куда. :).
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ошибка в 27 строчке кода. Точно говорю.
     
  9. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    Booster, таймер - timeSetEvent который, ос - WinXP
    n0name, 27: Ret :)

    Походу я нашел решение. Задержка происходила в обработчике данных, и я этот обработчик поместил в оконную процедуру. Когда срабатывает обработчик таймера и необходимо перейти в обработчик данных, то просто делаю PostMessage с передачей нужных аргументов этому окну. Сообщение встает в очередь, а управление возвращается обработчику таймера. Теперь задержки в оконной процедуре или обработчике данных, по идее, не должны влиять на события таймера. Пока работает стабильно :)
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    2xSoft
    The multimedia timer runs in its own thread

    Так что если твой код из отдельного потока обращается к GUI, то возможны проблемы.
     
  11. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    В каком смысле?

    Обработчик таймера вынесен в DLL, и когда наступает время передать пару слов основной программе, он делает PostMessage главному окну, передает необходимые аргументы и дальше себе работает. Если происходят тормоза в процедуре окна, то просто обновление инфы тормозит, на работе таймера это не сказывается. Самое главное, что прога еще ни разу краха не испытала после применением этого способа :)
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В том, что у тебя многопоточное приложение, а GUI на это не расчитано. Когда же ты используешь PostMessage, а не прямо обращаешься к интерфейсу из таймера, то в процедуре окна работает только один поток, и всё OK. Если же из таймера к GUI обращений нет, то можно и напрямую что-то делать в процедуре окна.
     
  13. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    Booster, неосилил :)

    Фишка в том, чтобы создать комфортную работу для таймера. Его обработчик по мере необходимости должен сообщить главному окну, что наступило некоторое время, а окно должно вывести информацию на экран. Если в окне происходила задержка, то процесс падал. Использование PostMessage решило эту проблему, т.к. управление сразу возвращалось в таймер, а когда там окно проснется и сможет вывести инфу, это уже его забота и на работе таймера не сказывается.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну у тебя получился обычный WM_TIMER, только из-за PostMessage интервал не гарантирован. Тебе надо просто уведомить о событии или в равные промежутки?
     
  15. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    Попробую объяснить суть задачи

    Есть переменные

    REAL_TIME DD 0
    NEXT_TIME DD 65535 ; 1 минута, 5 секунд, 535 милисекунд

    Есть процедура пуска таймера. Таймер запускается с интервалом в 1 мс, и увеличивает на 1 переменную REAL_TIME. Как только REAL_TIME = NEXT_TIME происходит несколько IN/OUT'ов и вызов PostMessage для обновления инфы в окне программы. Я прекрасно понимаю, что такой способ определения времени имеет достаточную погрешность, но на интервалах 5-10 минут этого пока достаточно. Суть задачи заключается в определении наступления события REAL_TIME = NEXT_TIME, при этом после выполнения необходимых действий NEXT_TIME принимает новое значение.

    IceStudent, верно, но как видно из вышесказанного есть некоторые различия.

    Быть может есть и другие способы, возможно более точные, для определения наступления заданного времени в миллисекундах?
     
  16. Nilos

    Nilos New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    14
    А может есть смысл поступить проще?
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nilos
    Нет, ему точность нужна.

    xSoft
    Поищи по форуму темы о высокоточных таймерах.
     
  18. xSoft

    xSoft New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    17
    IceStudent, верно, хотелось бы как можно точнее.

    По форуму первым делом смотрел. Самый точный таймер с простой работой и есть timeSetEvent :)