Платформа Win32 - Таймеры
Участников: 4
Страница 1 из 1
Платформа Win32 - Таймеры
Эта статья может несколько напоминать эту https://freebasic.forum2x2.ru/forum-f5/tema-t92.htm но я всё же решил написать.
О Таймерах
Таймер - внутренняя подпрограмма, которая неоднократно измеряет указанный интервал, в миллисекундах. Каждый раз, когда интервал (или значение блокировки времени) истекает, система посылает сообщение окну, связанному с таймером. Поскольку точность таймера зависит от тактовой частоты процессора и как часто приложение отыскивает сообщения в очереди сообщения, значение блокировки времени только приблизительно.
Для создания таймера используется функция SetTimer. Если дескриптор окна передается этой функции, приложение создает таймер для этого окна. Тогда, всякий раз, когда значение блокировки времени истекает, система отправляет сообщение WM_TIMER окну. Если никакой дескриптор окна не дается в SetTimer, приложение, которое создало таймер, должно контролировать его очередь сообщения для сообщений WM_TIMER и посылать их соответствующему окну.
Новый таймер начинает работать, как только он создан. Приложение может изменить значение блокировки времени таймера при использовании SetTimer и может разрушить таймер при использовании функции KillTimer. Чтобы использовать системные ресурсы эффективно, приложения должны разрушить таймеры, которые больше не нужны.
Каждый таймер имеет уникальный идентификатор. Параметр wParam сообщения WM_TIMER содержит идентификатор таймера, который отправлял сообщение.
Создание таймера
Создадим 2 таймера функцией SetTimer. Первый таймер будет настроен на каждые 10 секунд, второй таймер на каждые пять минут. (Перед созданием таймеров нужно зарегистрировать класс окна и создать окно, так как нам будет нужен идентификатор окна.)
Добавим в функцию WndProc, получающую сообщения от окна, выбор сообщения WM_TIMER.
Приложение может также создать таймер, чьи сообщения WM_TIMER обработаны не главной оконной процедурой, а определенной приложением функцией обратного вызова, как в следующем образце кода, который создает таймер и использует функцию MyTimerProc, чтобы обработать сообщения таймера WM_TIMER.
Если ваше приложение создает таймер, не определяя дескриптор окна, ваше приложение должно контролировать очередь сообщения для сообщений WM_TIMER и посылать их соответствующему окну.
Уничтожение таймера
Приложение должно вызвать функцию KillTimer для уничтожения таймера, который больше не нужен. Следующий пример демонстрирует уничтожение первого, второго и третьего таймеров.
О том, как создавать окна, рассказывалось в статье Платформа Win32 - Окна (https://freebasic.forum2x2.ru/forum-f10/tema-t61.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 - Окна (https://freebasic.forum2x2.ru/forum-f10/tema-t61.htm)
Последний раз редактировалось: zamabuvaraeu (Ср Окт 08, 2008 9:31 am), всего редактировалось 2 раз(а)
Re: Платформа Win32 - Таймеры
Упс! А ссылочка-то битая!
И я думаю, что место комментам уже в других постах сей темы, чтобы можно было собрать первые посты и напечатать книжку.
А таймеры, даже и не знал, что такое бывает. Спасибо! Потом почитаю.
И уже вопросик, чисто по терминологии. Заголовок не очен, ... может быть написать
"платформа win32 - таймеры окон"
имхо, так политкоректнее.
И я думаю, что место комментам уже в других постах сей темы, чтобы можно было собрать первые посты и напечатать книжку.
А таймеры, даже и не знал, что такое бывает. Спасибо! Потом почитаю.
И уже вопросик, чисто по терминологии. Заголовок не очен, ... может быть написать
"платформа win32 - таймеры окон"
имхо, так политкоректнее.
Re: Платформа Win32 - Таймеры
Респект!
Я предполагал, что имелась в виду моя темка, но рабочая ссылка всё же лучше.
Я предполагал, что имелась в виду моя темка, но рабочая ссылка всё же лучше.
Re: Платформа Win32 - Таймеры
А как быть в консольных или графических приложениях - не создающих своего Win32-окна?
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 50
Откуда : Кишинёв, Республика Молдоа
Re: Платформа Win32 - Таймеры
Можно, наверное, создать окно, чтобы получить его хэндл, но не выводить его просто.
Нужно подумать. Хотя не думаю, что можно запряч виндовые функции, для неродных конструкций.
Нужно подумать. Хотя не думаю, что можно запряч виндовые функции, для неродных конструкций.
Re: Платформа Win32 - Таймеры
В консольных приложениях и приложениях, которые не показывают окна, нужно просто создать окно но не отображать его командой ShowWindow и UpdateWindow. Все события таймера окно будет получать.
Re: Платформа Win32 - Таймеры
zamabuvaraeu, огромное спасибо, все доступно и понятно. будем ждать про ресурсы, и т.д.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения