Таймер в консольном приложении
Таймер в консольном приложении
Продолжаем раскрывать возможности консоли. Сегодня это будет выполнение действий через определенные интервалы, то есть, проще говоря, таймеры. В некоторых интернетах всплывает информация, что, мол, таймеры в консольных приложениях не поддерживаются или для этого надо городить какие-то жуткие конструкции типа отдельных потоков с проверкой времени. На самом деле консоль прекрасно работает с функцией SetTimer, только надо ее, как говорится, правильно готовить.
Активация таймеров выполняется при помощи функции SetTimer, но только в качестве окна-владельца таймера надо указывать NULL. Для чистоты эксперимента установим два таймера: один будет отправлять сообщения основному потоку консольного приложения, а второй при срабатывании будет вызывать указанную процедуру. Интервалы срабатывания тоже пусть будут разными.
Code (Assembler) : Убрать нумерацию
- ; Установить таймеры
- invoke SetTimer,NULL,1,500,TimerProc
- mov [timer1],eax
- invoke SetTimer,NULL,2,1000,NULL
- mov [timer2],eax
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------
- ; Функция обработки таймера
- ;-------------------------------------------------
- proc TimerProc hWnd:DWORD, nMsg:DWORD, nIDEvent:DWORD, dwTime:DWORD
- pusha
- ...
- ; Выполнить нужные действия по таймеру
- ...
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- loc_loop:
- ; Прочитать сообщение из очереди потока
- invoke GetMessage,msg,NULL,0,0
- or eax,eax
- je loc_exit
- invoke TranslateMessage,msg
- ; Сообщение от таймера?
- cmp [msg.message],WM_TIMER
- jne loc_dispatch
- ; Это нужный нам таймер?
- movzx eax,word [msg.wParam]
- cmp eax,[timer2]
- jne loc_dispatch
- ...
- ; Выполнить нужные действия по таймеру
- ...
- loc_dispatch:
- invoke DispatchMessage,msg
- jmp loc_loop
- loc_exit:
- ; Удалить таймеры
- invoke KillTimer,NULL,[timer1]
- invoke KillTimer,NULL,[timer2]
При удалении таймеров во время завершения работы программы в параметрах указываем хэндлы таймеров, полученные при их установке.
В приложении пример программы с исходным текстом, которая обрабатывает два таймера в консольном приложении. Выход по клавише Esc.
Просмотров: 1432 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
L-air
(08.02.2022 в 09:05):
О, консоль - это круто! Спасибо!
Джо
(08.02.2022 в 04:31):
В каком потоке будет выполняться таймер? Вроде как явно в консольном приложении message pump не создается (точнее консольное приложение может работать без message pump).
Добавить комментарий
Заполните форму для добавления комментария