Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SetTimer. механизм срабатывания callback, Как ведёт себя вызвавший поток? 
V
    Опции темы
Lexicss
Дата 19.2.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



UINT SetTimer(
    HWND hWnd,    // handle of window for timer messages
    UINT nIDEvent,    // timer identifier
    UINT uElapse,    // time-out value
    TIMERPROC lpTimerFunc    // address of timer procedure
   );
Функция SetTimer. Вызвав её с нулевыми параметрами дискриптора окна и идентифекатора, но с указанием адреса функции - выполняет функцию в потоке, который вызвал SetTimer, через указанный uElapse промежуток времени. 
Вопрос: Как ведёт себя вызваший поток, когда срабатывает таймер? Он ведь в это время может выполнять какие-то инструкции, а необходимо непременно выполнить callback function...  Вообщем, как осуществляется выполнение callback-функции вызванной таймером?
Не могу пока  найти никакой информации по этому.

Это сообщение отредактировал(а) Lexicss - 19.2.2008, 16:14
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Rennigth
Дата 19.2.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Lexicss, 
Цитата

lpTimerFunc
[in] Pointer to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc. If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter. 



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 19.2.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата

When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.

  Сообщение WM_TIMER по любому попадет в очередь сообщений потока и дефолтный обработчик должен вывать калбэк, если очереди сообщений нет, то фиг вам будет, а не калбэк  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lexicss
Дата 19.2.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



Rennigth, ну у меня ж lpTimerFunc = не NULL. 

Alexeis, 
Как я этот механизм понимаю:
Значит любой поток имеет дефолтный обработчик. И когда в очередь сообщений текущего потока попадает WM_TIMER, то этот дефолтный обработчик и вызывает callback-функцию.

Но я всё равно и не понял, как прерывается работа потока? Например, вызвал я SetTimer в главном потоке. Сработал таймер, обработчик спаймал WM_TIMER и тут же принялся выполнять колбэк-функцию, а когда выполнил, то вернулся снова к своим делам? Так что ли?


--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Alexeis
Дата 19.2.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Lexicss @  19.2.2008,  15:52 Найти цитируемый пост)
Но я всё равно и не понял, как прерывается работа потока? Например, вызвал я SetTimer в главном потоке. Сработал таймер, обработчик спаймал WM_TIMER и тут же принялся выполнять колбэк-функцию, а когда выполнил, то вернулся снова к своим делам? Так что ли?

  Угу.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 19.2.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Цитата(Lexicss @  19.2.2008,  16:52 Найти цитируемый пост)
Но я всё равно и не понял, как прерывается работа потока?

Если есть в потоке очередь сообщений, и поток в данный момент не занят чем либо еще то рано или поздно он поймает WM_TIMER и выполнит твою lpTimerFunc. Выролнение какого-то кода не прервется, если конечно не выполнять всяких Application.ProcessMessages.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Lexicss
Дата 19.2.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



Alexeis, 
Где-то я такое слышал что нельзя поток просто так взять и прерывать в случайный момент времени.

Добавлено через 7 минут и 14 секунд
Rennigth, 
Тогда смысл такой:
поток перебирает свою очередь и обрабатывает один за другим свои сообщения. т.о. и обрабатывает колбэк-функцию, когда добирается до WM_TIMER.

Т.е. никакого механизма с тревожным ожиданием потока здесь нет?
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Alexeis
Дата 19.2.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Получается, что если назначено окно, то вызывает API функция DefWindowProc если нет окна, то DispatchMessage


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lexicss
Дата 19.2.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



Есть ещё такое понятие как поступление APC-запроса в очеред с указанием адреса функции и параметра. 
В SetTimer и есть этот механизм?
Или здесь совсем нето. wm_timer сообщение в параметрах хранит адрес функции для обработчика?

Добавлено через 2 минуты и 49 секунд
Т.е. поток при срабатывании таймера не вводится в режим тревожного ожидания?
(хочу просто чётко с этим разобраться)
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
MetalFan
Дата 19.2.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(Lexicss @  19.2.2008,  17:32 Найти цитируемый пост)
Есть ещё такое понятие как поступление APC-запроса в очеред с указанием адреса функции и параметра. 
В SetTimer и есть этот механизм?

нет, этот механизм в таймерах ожидания и в очередях таймеров применяться afaik (Waitable Timer, Timer Queue)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Rennigth
Дата 19.2.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Цитата(Lexicss @  19.2.2008,  17:32 Найти цитируемый пост)
Есть ещё такое понятие как поступление APC-запроса в очеред с указанием адреса функции и параметра. 
В SetTimer и есть этот механизм?

Нет.

Цитата(Lexicss @  19.2.2008,  17:32 Найти цитируемый пост)
Или здесь совсем нето. wm_timer сообщение в параметрах хранит адрес функции для обработчика?

Да.


Цитата(Lexicss @  19.2.2008,  17:32 Найти цитируемый пост)
Т.е. поток при срабатывании таймера не вводится в режим тревожного ожидания?
(хочу просто чётко с этим разобраться) 

Если честно незнаю что ты имеешь ввиду под понятием "тревожного ожидания" smile

Вообщем юзай SetTimer/KillTimer и не тревожся. Он не очень точный конечно, есть другие, более точные, например мультимедийный таймер, вот они уже работаеют по всяким прерываниям и т.д.(не особо знаю механизм), и тогда уже могут возникать проблемы и может понадобится подобие синхронизации...


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Lexicss
Дата 19.2.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

Репутация: нет
Всего: 1



MetalFan, как это можно проверить на примере?
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
MetalFan
Дата 19.2.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Lexicss, что проверить? msdn уже нет доверия? )


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bems
Дата 19.2.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Alexeis @  19.2.2008,  17:13 Найти цитируемый пост)
Получается, что если назначено окно, то вызывает API функция DefWindowProc если нет окна, то DispatchMessage 
в любом случае _нужно_ вызывать DispatchMessage. А она уже передаст или в калбек или в процедуоу окна. Как в подпрограмму



--------------------
Обижено школьников: 8
PM MAIL   Вверх
MetalFan
Дата 19.2.2008, 22:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(bems @  19.2.2008,  19:16 Найти цитируемый пост)
в любом случае _нужно_ вызывать DispatchMessage

сначало необходимо создать очередь сообщений. вызвав GetMessage (PeekMessage)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.