文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

分布式缓存架构设计

零、 题记 在高并发场景下,需要通过缓存来减少数据库的压力,使得大量的访问进来能够命中缓存,只有少量的需要到数据库层。由于缓存基于内存,可支持的并发量远远大于基于硬盘的数据库。所以...

Ala6
28分钟前
2
0
简单工厂模式

public abstract class Operation { private double numberA = 0; private double numberB = 0; public double getNumberA() { return numberA; } ......

NinjaFrog
30分钟前
1
0
git(一) 基本操作(branch、tag、冲突)

layout: blog istop: true title: "git基本操作(branch、tag、冲突)" date: 2018-09-11 category: 版本控制 tags: - 版本控制 撤销操作 修改最后一次提交 解释:修改上次提交。可以修改内容...

开心的哈士奇
33分钟前
1
0
Vue中路由管理器Vue Router使用方式(二)-推荐

一、Vue中使用Vue Router简单方式使用 vue add xxx命令添加插件 使用步骤,本人假设已经安装好了Vue CLI工具,了解更多参考:VSCode 搭建Vue开发环境之Vue CLI 1.创建项目 vue create hello...

tianma3798
45分钟前
1
0
设计模式(十六)[结构模式] 装饰模式(Decorator)

1.什么是装饰模式? 装饰模式又名包装模式。装饰模式以对客户端透明的方式扩展对象功能,是继承关系的一个替代方案。 2.模式的类图 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收...

1527
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部