![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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 --------------------
Бери от жизни всё. |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Lexicss,
-------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Сообщение WM_TIMER по любому попадет в очередь сообщений потока и дефолтный обработчик должен вывать калбэк, если очереди сообщений нет, то фиг вам будет, а не калбэк -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Rennigth, ну у меня ж lpTimerFunc = не NULL.
Alexeis, Как я этот механизм понимаю: Значит любой поток имеет дефолтный обработчик. И когда в очередь сообщений текущего потока попадает WM_TIMER, то этот дефолтный обработчик и вызывает callback-функцию. Но я всё равно и не понял, как прерывается работа потока? Например, вызвал я SetTimer в главном потоке. Сработал таймер, обработчик спаймал WM_TIMER и тут же принялся выполнять колбэк-функцию, а когда выполнил, то вернулся снова к своим делам? Так что ли? --------------------
Бери от жизни всё. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Угу. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Если есть в потоке очередь сообщений, и поток в данный момент не занят чем либо еще то рано или поздно он поймает WM_TIMER и выполнит твою lpTimerFunc. Выролнение какого-то кода не прервется, если конечно не выполнять всяких Application.ProcessMessages. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Alexeis,
Где-то я такое слышал что нельзя поток просто так взять и прерывать в случайный момент времени. Добавлено через 7 минут и 14 секунд Rennigth, Тогда смысл такой: поток перебирает свою очередь и обрабатывает один за другим свои сообщения. т.о. и обрабатывает колбэк-функцию, когда добирается до WM_TIMER. Т.е. никакого механизма с тревожным ожиданием потока здесь нет? --------------------
Бери от жизни всё. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Получается, что если назначено окно, то вызывает API функция DefWindowProc если нет окна, то DispatchMessage
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
Есть ещё такое понятие как поступление APC-запроса в очеред с указанием адреса функции и параметра.
В SetTimer и есть этот механизм? Или здесь совсем нето. wm_timer сообщение в параметрах хранит адрес функции для обработчика? Добавлено через 2 минуты и 49 секунд Т.е. поток при срабатывании таймера не вводится в режим тревожного ожидания? (хочу просто чётко с этим разобраться) --------------------
Бери от жизни всё. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
нет, этот механизм в таймерах ожидания и в очередях таймеров применяться afaik (Waitable Timer, Timer Queue) -------------------- There are always someone smarter than you... |
|||
|
||||
| Rennigth |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 8 Всего: 76 |
Нет.
Да.
Если честно незнаю что ты имеешь ввиду под понятием "тревожного ожидания" Вообщем юзай SetTimer/KillTimer и не тревожся. Он не очень точный конечно, есть другие, более точные, например мультимедийный таймер, вот они уже работаеют по всяким прерываниям и т.д.(не особо знаю механизм), и тогда уже могут возникать проблемы и может понадобится подобие синхронизации... -------------------- (* Honesta mors turpi vita potior *) |
||||||
|
|||||||
| Lexicss |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 197 Регистрация: 16.8.2006 Где: Беларусь, Минск Репутация: нет Всего: 1 |
MetalFan, как это можно проверить на примере?
--------------------
Бери от жизни всё. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Lexicss, что проверить? msdn уже нет доверия? )
-------------------- There are always someone smarter than you... |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
сначало необходимо создать очередь сообщений. вызвав GetMessage (PeekMessage) -------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |