Платформа Win32 - Таймеры

Предыдущая тема Следующая тема Перейти вниз

Платформа Win32 - Таймеры

Сообщение  Замабувараев в Ср Окт 08, 2008 4:42 am

Эта статья может несколько напоминать эту http://freebasic.justforum.net/forum-f5/tema-t92.htm но я всё же решил написать.

О Таймерах

Таймер - внутренняя подпрограмма, которая неоднократно измеряет указанный интервал, в миллисекундах. Каждый раз, когда интервал (или значение блокировки времени) истекает, система посылает сообщение окну, связанному с таймером. Поскольку точность таймера зависит от тактовой частоты процессора и как часто приложение отыскивает сообщения в очереди сообщения, значение блокировки времени только приблизительно.

Для создания таймера используется функция SetTimer. Если дескриптор окна передается этой функции, приложение создает таймер для этого окна. Тогда, всякий раз, когда значение блокировки времени истекает, система отправляет сообщение WM_TIMER окну. Если никакой дескриптор окна не дается в SetTimer, приложение, которое создало таймер, должно контролировать его очередь сообщения для сообщений WM_TIMER и посылать их соответствующему окну.

Новый таймер начинает работать, как только он создан. Приложение может изменить значение блокировки времени таймера при использовании SetTimer и может разрушить таймер при использовании функции KillTimer. Чтобы использовать системные ресурсы эффективно, приложения должны разрушить таймеры, которые больше не нужны.
Каждый таймер имеет уникальный идентификатор. Параметр wParam сообщения WM_TIMER содержит идентификатор таймера, который отправлял сообщение.

Создание таймера

Создадим 2 таймера функцией SetTimer. Первый таймер будет настроен на каждые 10 секунд, второй таймер на каждые пять минут. (Перед созданием таймеров нужно зарегистрировать класс окна и создать окно, так как нам будет нужен идентификатор окна.)

Код:

' Создание таймеров

' Создание первого таймера
 SetTimer(hwnd, _            /' Идентификатор окна, получающего сообщения '/
    1, _                    /' Идентификатор первого таймера, любое целое положительное число, определяется самим программистом '/
    10000, _                /' 10-секундный интервал, указывается в миллисекундах '/
    NULL)    /' Адрес функции обратного вызова таймера, пустой '/

' Создание второго таймера

SetTimer(hwnd, _            /' Идентификатор окна, получающего сообщения '/
    2, _                    /' Идентификатор второго таймера '/
    300000, _              /' 5-минутный интервал '/
    NULL)    /' Адрес функции обратного вызова таймера, пустой '/

Добавим в функцию WndProc, получающую сообщения от окна, выбор сообщения WM_TIMER.

Код:

Function WndProc(ByVal hWnd As HWND, _
                  ByVal wMsg As UINT, _
                  ByVal wParam As WPARAM, _
                  ByVal lParam As LPARAM) As LRESULT
   
    Select Case(wMsg)
       Case WM_CREATE
          ' Здесь должна происходить инициализация
       Сase WM_TIMER
          ' Событие таймера
          ' Узнаем, какой из таймеров послал сообщение
         Select Case wParam
            Case 1
               ' Сообщение пришло от первого таймера
               ' Через 10 секунд
            Case 2
               ' Событие вызвал 5-минутный таймер
         End Select
       Case WM_CLOSE
          ' Сообщение о закрытии окна
          ' Окно нужно уничтожить
            DestroyWindow(hWnd)
       Case WM_DESTROY
          ' Окно разрушается, выходим из цикла сообщений
            PostQuitMessage(0)
       Case Else
          ' Посылаем все сообдения, которые мы не обрабатываем
          ' функции по умолчанию
            Return DefWindowProc(hWnd, wMsg, wParam, lParam)   
    End Select
   
End Function

Приложение может также создать таймер, чьи сообщения WM_TIMER обработаны не главной оконной процедурой, а определенной приложением функцией обратного вызова, как в следующем образце кода, который создает таймер и использует функцию MyTimerProc, чтобы обработать сообщения таймера WM_TIMER.

Код:

' Создание таймера
 SetTimer(hwnd,  _              /' Идентификатор окна '/
    3,  _                      /' Идентификатор таймера '/
    5000,  _                  /' 5-секундный интервал '/
    @MyTimerProc) /' Адрес функции обратного вызова таймера '/

Если ваше приложение создает таймер, не определяя дескриптор окна, ваше приложение должно контролировать очередь сообщения для сообщений WM_TIMER и посылать их соответствующему окну.

Код:

 Dim hwndTimer As HWND    ' Идентификатор окна для сообщений таймера
  Dim wMsg As MSG          ' Сообщения, принимаемые от окна
 
    ' Цикл обработки сообщений от окна
    Do While GetMessage(@wMsg, 0, 0, 0) <> 0
        ' Посылаем сообщение WM_TIMER
        If wMsg = WM_TIMER Then
            wMsg.Hwnd = hwndTimer
        End If
        TranslateMessage(@wMsg)
        DispatchMessage(@wMsg)
    Loop

Уничтожение таймера

Приложение должно вызвать функцию KillTimer для уничтожения таймера, который больше не нужен. Следующий пример демонстрирует уничтожение первого, второго и третьего таймеров.

Код:

       Case WM_CLOSE
          ' Сообщение о закрытии окна
         ' Уничтожаем таймеры
          KillTimer(hwnd, 1)
         KillTimer(hwnd, 2)
          KillTimer(hwnd, 3)

О том, как создавать окна, рассказывалось в статье Платформа Win32 - Окна (http://freebasic.justforum.net/forum-f10/tema-t61.htm)


Последний раз редактировалось: zamabuvaraeu (Ср Окт 08, 2008 9:31 am), всего редактировалось 2 раз(а)
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 34
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Eric-S в Ср Окт 08, 2008 7:35 am

Упс! А ссылочка-то битая!
И я думаю, что место комментам уже в других постах сей темы, чтобы можно было собрать первые посты и напечатать книжку.

А таймеры, даже и не знал, что такое бывает. Спасибо! Потом почитаю.

И уже вопросик, чисто по терминологии. Заголовок не очен, ... может быть написать
"платформа win32 - таймеры окон"
имхо, так политкоректнее.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Замабувараев в Ср Окт 08, 2008 9:32 am

Теперь всё исправлено, ссылка работает, тема переименована.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 34
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Eric-S в Ср Окт 08, 2008 9:47 am

Респект!
Я предполагал, что имелась в виду моя темка, но рабочая ссылка всё же лучше.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  justar в Ср Окт 08, 2008 10:42 am

А как быть в консольных или графических приложениях - не создающих своего Win32-окна?

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 43
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Eric-S в Ср Окт 08, 2008 12:09 pm

Можно, наверное, создать окно, чтобы получить его хэндл, но не выводить его просто.
Нужно подумать. Хотя не думаю, что можно запряч виндовые функции, для неродных конструкций.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Замабувараев в Ср Окт 08, 2008 1:28 pm

В консольных приложениях и приложениях, которые не показывают окна, нужно просто создать окно но не отображать его командой ShowWindow и UpdateWindow. Все события таймера окно будет получать.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 34
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  electrik в Ср Окт 08, 2008 6:34 pm

zamabuvaraeu, огромное спасибо, все доступно и понятно. будем ждать про ресурсы, и т.д.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Eric-S в Чт Окт 09, 2008 2:00 am

Насколько я знаю, на очереди менюшки. И очень надеюсь на списки.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Платформа Win32 - Таймеры

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения