如何使用定时器

本文介绍了一个使用MASMPlus实现的定时器示例,通过设置20个200毫秒周期后退出程序的过程,展示了如何使用SetTimer和KillTimer函数。此示例还涉及了汇编语言中窗口过程的处理。

2009-05-16 00:43:56

 

函数源型


   UINT_PTR SetTimer(     //创建一个定时器
         HWND hWnd,  // 所在线程的handler,如果这个值为Null而下面nIDEvent
                    这个参数不为0,表示替换nIDEvent这个定时器
         UINT_PTR nIDEvent,// 定时器ID,多个定时器时,可以通过该ID判断是
                          哪个定时器
         UINT uElapse,      // 时间间隔,单位为毫秒
         TIMERPROC lpTimerFunc   // 回调函数
              );


   BOOL KillTimer(           //释放一个定时器
          HWND hWnd,            //释放handle线程的定时器
      UINT_PTR uIDEvent    //释放编号为 uIDEvent 的定时器
          );
   

 

例子,

 

20 个200毫秒    后退出程序

 

 

;MASMPlus 代码模板 - 普通的 Windows 程序代码

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
 
 WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
 WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
 
.DATA
 szClassName db "MASMPlus_Class",0
 Counter     db  20
.DATA?
 hInstance dd  ?
 Handle1    dd    ?
   Handle2    dd  ?
 TimerID     dd  ? 
 
.CODE
START:

 invoke GetModuleHandle,NULL
 mov hInstance,eax
 invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
 invoke ExitProcess,0

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
 LOCAL wc   :WNDCLASSEX
 LOCAL msg  :MSG
 local hWnd :HWND
 
 mov wc.cbSize,sizeof WNDCLASSEX
 mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
 mov wc.lpfnWndProc,offset WndProc
 mov wc.cbClsExtra,NULL
 mov wc.cbWndExtra,NULL
 push hInst
 pop wc.hInstance
 mov wc.hbrBackground,COLOR_BTNFACE+1
 mov wc.lpszMenuName,NULL
 mov wc.lpszClassName,offset szClassName
 invoke LoadIcon,hInst,100
 mov wc.hIcon,eax
 invoke LoadCursor,NULL,IDC_ARROW
 mov wc.hCursor,eax
 mov wc.hIconSm,0
 invoke RegisterClassEx, ADDR wc
 invoke CreateWindowEx,NULL,ADDR szClassName,CTXT("更改'开始'按钮"),WS_OVERLAPPEDWINDOW,200,200,400,200,NULL,NULL,hInst,NULL
 mov hWnd,eax
 invoke ShowWindow,hWnd,SW_SHOWNORMAL
 invoke UpdateWindow,hWnd
 
 StartLoop:
  invoke GetMessage,ADDR msg,NULL,0,0
   cmp eax, 0
   je ExitLoop
    invoke TranslateMessage, ADDR msg
    invoke DispatchMessage, ADDR msg
   jmp StartLoop
 ExitLoop:
 
mov eax,msg.wParam
ret
WinMain endp
TimerProc   proc
;      invoke wsprintf,offset buffer,CTXT("."),NULL
      ;invoke MessageBeep,MB_OK
        dec Counter                          ;计数减1
        jnz NoKill                           ;到0了没
        invoke  KillTimer, NULL, TimerID      ;释放定时器
        invoke  PostQuitMessage,NULL
   NoKill:  
         ret               
   TimerProc   endp

WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
 .if uMsg==WM_CREATE
  ;invoke FindWindow ,CTEXT('Shell_TrayWnd'),NULL
 ; MOV Handle1,EAX
 ; invoke FindWindowEx ,Handle1,0,CTEXT("BUTTON"),NULL
 ;  mov     Handle2,eax
 ;  invoke SetWindowText,Handle2,CTEXT("121")
 ;  INVOKE UpdateWindow ,Handle2
 invoke  SetTimer, NULL, 0, 200, addr TimerProc  
     mov TimerID,eax                       
 .elseif uMsg == WM_DESTROY
  invoke PostQuitMessage,NULL
 .else
  invoke DefWindowProc,hWin,uMsg,wParam,lParam
 .endif
 ret
WndProc endp

END START

在 Visual Studio 2019 中使用定时器,你可以按照以下步骤进行操作: 1. 打开你的项目,确保你已经包含了 `windows.h` 头文件。 2. 在你想要使用定时器的源文件中,定义一个 `UINT_PTR` 类型的变量作为定时器 ID。例如:`UINT_PTR timerID;` 3. 在需要启动定时器的地方,使用 `SetTimer` 函数来创建一个定时器。函数原型如下: ```c++ UINT_PTR SetTimer( HWND hWnd, // 窗口句柄,可以是主窗口或者其他窗口 UINT_PTR nIDEvent, // 定时器 ID UINT uElapse, // 定时器间隔,以毫秒为单位 TIMERPROC lpTimerFunc // 定时器回调函数,当定时器超时时将会调用该函数 ); ``` 例如,创建一个 1 秒间隔的定时器: ```c++ timerID = SetTimer(NULL, 0, 1000, NULL); ``` 4. 如果你需要在定时器超时后执行某个操作,你可以创建一个专门的回调函数。回调函数的原型如下: ```c++ void CALLBACK TimerProc( HWND hWnd, UINT uMsg, UINT_PTR nIDEvent, DWORD dwTime ); ``` 在回调函数中,你可以编写你想要执行的操作。 5. 要停止定时器使用 `KillTimer` 函数。函数原型如下: ```c++ BOOL KillTimer( HWND hWnd, // 窗口句柄,与启动定时器时的窗口句柄一致 UINT_PTR uIDEvent // 定时器 ID,与启动定时器时的定时器 ID 一致 ); ``` 例如,停止之前创建的定时器: ```c++ KillTimer(NULL, timerID); ``` 这是一个基本的示例,可以帮助你在 Visual Studio 2019 中使用定时器。请根据你的具体需求进行适当的修改和扩展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值