文档章节

WinAPI: SetTimer、KillTimer - 创建与移除高性能定时器

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 573
阅读 58
收藏 0
//创建定时器函数的声明:
SetTimer(
  hWnd: HWND;               {与定时器相关联的窗口句柄}
  nIDEvent: UINT;           {指定一个非 0 的定时器标识符}
  uElapse: UINT;            {指定间隔时间, 单位是毫秒}
  lpTimerFunc: TFNTimerProc {每到时间后, 要调用的函数的指针}
): UINT;                    {返回定时器标识符; 失败返回 0}

//移除定时器函数的声明:
KillTimer(
  hWnd: HWND;    {与定时器相关联的窗口句柄}
  uIDEvent: UINT {定时器标识符}
): BOOL;

//处理 WM_TIMER 消息的回调函数的格式:
TimerProc(
  hWnd: HWND;    {与定时器相关联的窗口句柄}
  uMsg: UINT;    {WM_TIMER 消息}
  idEvent: UINT; {定时器的标识符}
  Time: DWORD    {以世界时间公约格式(UTC)指定的系统时间}
);               {这是个过程, 无返回值}

 
 
 
 
 

 

 

  
应该先理解一下再举例:

SetTimer 的参数1: hWnd, 一般指定 Self.Handle 就可以了;

SetTimer 的参数2: nIDEvent 是某个定时器的标识符, 说明可以创建若干个定时器, 随便给个正整数即可;

SetTimer 的参数3: uElapse, 这相当于 VCL 中 Timer 类的 Interval 属性;

看来参数 1-3 还是非常简单, 不好理解的就是参数4: lpTimerFunc, 这是一个过程的地址.

任意一个过程的地址吗? 当然不是; 这个过程的参数结构是 Windows 系统规定的, 我们必须按规定去定义这个过程; 即使你用不到其中的参数也必须如此.
//举例:
var
  i: Integer;

//先定义回调函数
procedure MyTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD);
begin
  Form1.Text := IntToStr(i);
  Inc(i);
end;

//创建定时器
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetTimer(Handle, 1, 10, @MyTimerProc); {每 1/100 秒调用一次 MyTimerProc}
end;

//删除定时器
procedure TForm1.Button2Click(Sender: TObject);
begin
  KillTimer(Handle, 1); {创建时指定的定时器标识是 1, 这里必须要一致}
end;

 
 
 
 
 

 

 

  
//如果回调过程是窗体类的一个方法, 需要这样: var i: Integer; //先定义回调函数 procedure TForm1.MyTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD); begin Text := IntToStr(i); Inc(i); end; //创建定时器 procedure TForm1.Button1Click(Sender: TObject); begin SetTimer(Handle, 1, 10, @TForm1.MyTimerProc); {每 1/100 秒调用一次 MyTimerProc} end; //删除定时器 procedure TForm1.Button2Click(Sender: TObject); begin KillTimer(Handle, 1); {创建时指定的定时器标识是 1, 这里必须要一致} end;

本文转载自:http://www.cnblogs.com/del/archive/2008/02/16/1070649.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
VC++ WM_TIMER 定时器使用方法

在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定...

文艺小青年
2017/06/01
0
0
C++ 定时器的用法:SetTimer和Ontimer

SetTimer函数的用法 1)用WMTIMER来设置定时器 先请看SetTimer这个API函数的原型 UINTPTR SetTimer( HWND hWnd,//和定时器相关联的窗口 UINT_PTR nIDEvent,//一个非0的数字标志这个定时器 UI...

吃一堑消化不良
2015/11/17
0
0
【Visual C++】游戏开发笔记之七——基础动画显示(一)定时器的使用

本系列文章由zhmxy555编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7343337 作者:毛星云 邮箱: happylifemxy@qq.com 欢迎邮件交流编程心得 定时器的使用 定时器...

长平狐
2012/11/12
128
0
MFC定时器的使用

参考:http://www.cnblogs.com/chengxuyuancc/archive/2012/06/08/2542269.html MFC提供了3个定时器函数来完成有关定时器功能: UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK ......

长平狐
2013/03/19
78
0
VC++控制台程序中使用定时器

我现在项目是一个控制台程序,用到的Win32API都是与界面无关的,今天需要加入定时器刷新的功能,由于没有消息循环,所以WM_TIMER消息应该如何处理呢?综合了下网上找到的资料,写了个简单的d...

嗯哼9925
2017/12/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
1
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部