//创建定时器函数的声明:
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 系统规定的, 我们必须按规定去定义这个过程; 即使你用不到其中的参数也必须如此.


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

转载于:https://www.cnblogs.com/del/archive/2008/02/16/1070649.html

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

  1. html div 移除,js动态创建及移除div的方法

    本文实例讲述了js动态创建及移除div的方法.分享给大家供大家参考.具体实现方法如下: //创建div function createDiv(){ if(document.getElementById ...

  2. 使用epoll+时间堆实现高性能定时器

    在开发Linux网络程序时,通常需要维护多个定时器,如维护客户端心跳时间.检查多个数据包的超时重传等.如果采用Linux的SIGALARM信号实现,则会带来较大的系统开销,且不便于管理. 本文在应用层 ...

  3. 在 Mac 上创建和移除替身

    若要更容易地查找文件.文件夹.App 或磁盘,您可以为它们创建替身,然后将替身放到容易找到的位置.当您打开替身时,原始项目会打开. 创建替身 在 Mac 上,请执行以下一项操作: 选择项目,然后选取& ...

  4. 【高性能定时器】 时间轮

    时间轮 简述 顾名思义,时间轮就像一个轮子,在转动的时候外界会指向轮子不同的区域,该区域就可以被使用.因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽(即时间轮划分的区域)之中,就可以实现 ...

  5. 高性能定时器--时间轮/多级时间轮

    运行原理 指针指向轮子上的一个槽,轮子以恒定的速度顺时针转动,每转动一步就指向下一个槽(虚线指针指向的槽),每次转动称为一个tick,一个tick的时间称为时间轮的槽间隔slot interval,即 ...

  6. 高性能定时器-------时间轮

    基于排序链表的定时器(https://blog.csdn.net/destory27/article/details/81748580)存在一个问题:添加定时器的效率偏低. 如图所示时间轮内,指针指向 ...

  7. 网络编程 高性能定时器数据结构分析 | 时间轮 红黑树定时器性能分析 | 为什么要做用户态定时器

    为什么要用户态的定时器? 首先是为什么要做定时器,定时器的主要说的是我们的应用(业务?功能?总之有这个需求)要做一个定时的任务.其实如果不想为什么,好像是理所当然的.我写这个的时候,知乎有一个问题(L ...

  8. 高性能定时器2——红黑树实现

    ​ 在网络程序中我们通常要处理三种事件,网络I/O事件.信号以及定时事件,我们可以使用I/O复用系统调用(select.poll.epoll)将这三类事件进行统一处理.我们通常使用定时器来检测一个客户 ...

  9. Linux网络编程 | 高性能定时器 :时间轮、时间堆

    文章目录 时间轮 时间堆 在上一篇博客中我实现了一个基于排序链表的定时器容器,但是其存在一个缺点--随着定时器越来越多,添加定时器的效率也会越来越低. 而下面的两个高效定时器--时间轮.时间堆,会完美 ...

最新文章

  1. 如何查java当前负载_Linux查看机器负载
  2. mysql 5.5 5.6差异,MySQL5.5和MySQL5.6授权区别
  3. 第一篇:VC连接MySql
  4. 字符函数和内存函数模拟实现
  5. 最经典的Linux入门命令
  6. 滴滴派发15亿出行消费券 覆盖快车、优享等多产品
  7. TIOBE 3 月编程语言排行榜:Ruby 重回前十,Kotlin 突围
  8. 【网络编程】网络协议简析
  9. 网络安全——kali_Linux基本命令大全
  10. 很全很强大国内值得关注的官方API集合(太幸福啦)
  11. 2003年新版CCNP考试大纲---CITV5.0(转)
  12. 数字助手:Siri、Google和Alexa之间的PK
  13. 卸载windows 自带 内置软件应用 2022,windows垃圾清理技巧
  14. 将Twitter4j与Scala结合使用以执行用户操作
  15. 微信公众号、微信号、微信文章爬虫(搜狗搜索)
  16. UICC 之 USIM 详解全系列——USIM App文件结构
  17. 无线传感器网络路由协议AODV(Ad hoc on-demand distance vector routing)
  18. 【路由器】TP Link TL-WR702N 迷你路由器为何无法进入管理后台
  19. uniapp 页面滚动获取元素高度
  20. verilog写的一个简洁实用的PWM模块

热门文章

  1. 百度图神经网络学习——day02:图游走类模型
  2. 人工智能AI、机器学习和深度学习的区别
  3. android 浏览器开技术
  4. 文档打开后服务器报警,MetaTrader 4客户段的秘密:警报系统
  5. vb串口 任意波特率_串口通讯基本知识
  6. 实现一个符合标准的Promise
  7. Vue笔记(四)——Vue动画路由
  8. 二次开发-如何在PHPEMS-发送短信验证码(以easy-sms为例)
  9. 常见Linux发行版的异同
  10. JS 获取指定URL的时间