Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Assembler FAQ > Таймер в консольной программе |
Автор: Jin X 01.04.05, 14:34 |
Использование таймера в консольной программе Использование WinAPI-функции SetTimer не обязательно требует наличия окна. Можно просто указать адрес процедуры, а затем запустить цикл GetMessage. Чтобы завершить работу приложения, необходимо послать ему сообщение WM_QUIT. Как видите, всё элементарно, и говорить здесь больше не о чем Хотите пример? Пожалуйста! <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ; ml /c /coff /Ic:\masm32\include contimer.asm ; link /subsystem:console /libpath:c:\masm32\lib contimer.obj .586P .MODEL Flat,StdCall OPTION CASEMAP:NONE INCLUDE WINDOWS.INC INCLUDE KERNEL32.INC INCLUDE USER32.INC INCLUDELIB KERNEL32.LIB INCLUDELIB USER32.LIB .DATA String db '.' ; Строка для вывода Counter db 10 ; Счётчик (кол-во запусков TimerProc) lpMsg MSG <> ; Буфер для сообщения TimerID dd ? ; Идентификатор таймера hConOut dd ? ; Дескриптор стандартного вывода Result dd ? ; Кол-во записанных байт через WriteConsole .CODE ; Процедура, запускаемая по таймеру TimerProc proc hWnd, uMsg, idEvent, dwTime: DWORD ; Выводим в стандартный вывод строку invoke WriteConsole, hConOut, addr String, sizeof String, addr Result, NULL dec Counter ; Уменьшаем счётчик jnz @@NoKill ; Если счётчик = 0, то удаляем таймер и посылаем WM_QUIT invoke KillTimer, NULL, TimerID invoke PostQuitMessage @@NoKill: ret ; Выходим из процедуры TimerProc endp ;----------------------------------------------------------------------------; ; Начало основной программы ; ;----------------------------------------------------------------------------; Start: ; Получаем дескриптор стандартного вывода и сохраняем его invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConOut, eax ; Устанавливаем таймер invoke SetTimer, NULL, 0, 200, addr TimerProc mov TimerID,eax @@Repeat: ; Запускаем цикл GetMessage invoke GetMessage, addr lpMsg, NULL, 0, 0 or eax,eax jz @@Exit ; Выходим из цикла, если получено WM_QUIT invoke TranslateMessage, addr lpMsg invoke DispatchMessage, addr lpMsg jmp @@Repeat @@Exit: ; Выходим из программы invoke ExitProcess, NULL END Start |