![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
Вобщем вопрос.
Есть класс, в нем надо делать что-то, через какое-то время. Можно делать SetTimer(0, ID_TIMER, TIMEOUT, (LPTIMERPROC)TimerProc); Но тогда функция TimerProc должна быть static, а мне надо иметь доступ к нестатическим членам класса. Как можно это обойти? Не ложить же статик-мембереом указатель на самого себя, или не объявлять глобальную переменную. -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
И что будет? TimerProc получит доступ к неявному указателю this?
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
Действительно, что-то я сморозил не то ИМХО простого выхода из этой ситуации нет. Если он вообще есть конечно... Это сообщение отредактировал(а) artsb - 15.2.2010, 12:46 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
можно сделать так:
можно TimerProc сделать шаблоном, тогда вообще все просто:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
не забывай что функция Таймера это CallBack функция, из которой нужно вернуть управление циклу сообщений.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ты точно знаешь, что это сработает? Дело в том, что MSDN пишет, что при hWnd == 0 ид-р таймера игнорируется.
Я тоже было хотела это предложить, да призадумалась над этой фразой. Как минимум, надо проверять (что ид-р будет приходить в call-back без искажений). -------------------- ... |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Создавай таймер с помощью потока.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Если выбирать между ни зачем больше не нужным потоком и статической переменной, я бы выбрала статическую переменную. Вот ей богу. По принципу Оккама. -------------------- ... |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
GremlinProg, сделал как ты написал, не работает.Все приходит, захожу в функцию обработчик таймера, но в this какой-то мусор. В MSDN написано что idEvent должен быть 0 если HWND == 0.
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Что-то вроде этого
создаем шаблонную функцию, которая будет вызываться таймером и вызывать соответствующую member функцию. Типы можно передать в compile-time, проблема с this, это решаем таким образом - создаем класс для регистрации объектов, пусть он может хранить по умолчанию 100 объектов.
использование
Пойдет? полный пример
Это навскидку, можно доработать. Это сообщение отредактировал(а) azesmcar - 16.2.2010, 09:28 |
||||||||
|
|||||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в районе полугода-года я пользовался таймером без окна в объектной модели, а отказался я от использования этого таймера по причине использования им очереди сообщений независимо от того, есть HWND или нет, что в моем случае означало его бесполезность, т.к. там нужно было следить за сменой состояния этой самой очереди, масло масляное вобщем с ним выходило т.е. независимо от первого параметра, сообщение поступит в обычную очередь и будет извлечено обычным способом, тут просто предоставляется возможность в цикле сообщений дополнить это сообщение желаемым дескриптором, что на самом деле реализуется крайне редко, т.е. в основном такой таймер, с hwnd=0 используется за пределами окон вот как раз эта очередь и дальнейшее дополнение сообщения WM_TIMER и требует какой-то внутренней идентификации "импульса" таймера, чтобы можно было дальше обработать сообщение обычным образом, через процедуру окна, а другого способа ввести эту идентификацию кроме как через nIDEvent нету можно конечно и проверить, полагаю, Andrey44 это сделать проще Добавлено через 10 минут и 49 секунд если приходит не 0, значит там точно не мусор, смотри за периодом жизни объекта, думаю в этом дело -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
есть ещё вариант специально создать окно для обработки таймера
начиная с Windows XP даже есть тип окна "message only window" если уж окна совсем не хочется, можно воспользоваться waitable timer, ожидание которого можно встроить в очередь сообщений, но тогда понадобится переменная, доступная коду работы с очередью, которая хранит соответствие индексов, таймеров и функторов -------------------- qqq |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Не прокатит: его нужно ждать функцией WaitForSingleObject (или Multiple) и, соответственно, стоять. Либо писать цикл - заглянул в таймер (с нулевым ожиданием), сделал что-то и т.д. Но это страшно неудобно. В общем, WaitableTimer - отличная штука для рабочего потока, но не для главного. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |