Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)