C++中的定时器-SetTimer
先请看SetTimer这个API函数的原型
- UINT_PTR SetTimer(
- HWND hWnd, // 窗口句柄
- UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
- UINT uElapse, // 时间间隔,单位为毫秒
- TIMERPROC lpTimerFunc // 回调函数
- );
例如
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:
UINT SetTimer(1,100,NULL);
函数反回值就是第一个参数值1,表示此定时器的ID号。
第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。
1.2 调用回调函数
此方法首先写一个如下格式的回调函数
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。
2、多个定时器的实现与应用
我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAM wParam中的值便是该定时器的ID
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子
- void CTimerTestDlg::OnTimer(UINT nIDEvent)
- {
- switch (nIDEvent)
- {
- case 24: ///处理ID为24的定时器
- Draw1();
- break;
- case 25: ///处理ID为25的定时器
- Draw2();
- break;
- }
- CDialog::OnTimer(nIDEvent);
- }
当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:
- void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
- {
- switch(nTimerid)
- {
- case 1: ///处理ID为1的定时器
- Do1();
- break;
- case 2: ///处理ID为2的定时器
- Do2();
- break;
- }
- }
3、取消定时器
不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下
- BOOL KillTimer(
- HWND hWnd, // 窗口句柄
- UINT_PTR uIDEvent // ID
- );
在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
例子
- #include <windows.h>
- #include <iostream>
- VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
- VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
- {
- std::cout < < "hello " < < std::endl;
- }
- void main()
- {
- int timer1 = 1;
- HWND hwndTimer;
- MSG msg;
- SetTimer(NULL,timer1,5000,TimerProc);
- int itemp;
- while ( (itemp = GetMessage(&msg, NULL,NULL,NULL))&& (itemp!=0) && (-1 != itemp))
- {
- if (msg.message == WM_TIMER)
- {
- std::cout < < "i got the message " < < std::endl;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- }
输出如下:
i got the message
hello
i got the message
hello
i got the message
hello
- ---------------------------------------------------------------------------------------------------------------------------
- // timer.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <windows.h>
- #include <stdio.h>
- #include <conio.h>
- unsigned long WINAPI Thread(PVOID pvoid);
- void main()
- {
- DWORD dwThreadId;
- printf("use timer in workthread of console application<masterz>\n");
- HANDLE hThread = CreateThread(
- NULL, // no security attributes
- 0, // use default stack size
- Thread, // thread function
- 0, // argument to thread function
- 0, // use default creation flags
- &dwThreadId);
- DWORD dwwait=WaitForSingleObject(hThread,1000*30);
- switch(dwwait)
- {
- case WAIT_ABANDONED:
- printf("main thread WaitForSingleObject return WAIT_ABANDONED\n");
- break;
- case WAIT_OBJECT_0:
- printf("main thread WaitForSingleObject return WAIT_OBJECT_0\n");
- break;
- case WAIT_TIMEOUT:
- printf("main thread WaitForSingleObject return WAIT_TIMEOUT\n");
- break;
- }
- CloseHandle(hThread);
- _getch();
- }
- unsigned long WINAPI Thread(PVOID pvoid)
- {
- MSG msg;
- PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
- UINT timerid=SetTimer(NULL,111,3000,NULL);
- BOOL bRet;
- int count =0;
- while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
- {
- if (bRet == -1)
- {
- // handle the error and possibly exit
- }
- else
- if(msg.message==WM_TIMER)
- {
- count++;
- printf("WM_TIMER in work thread count=%d\n",count);
- if(count>4)
- break;
- }
- else
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- KillTimer(NULL,timerid);
- printf("thread end here\n");
- return 0;
- }
C++中的定时器-SetTimer相关推荐
- VC++控制台程序中使用定时器
我现在项目是一个控制台程序,用到的Win32API都是与界面无关的,今天需要加入定时器刷新的功能,由于没有消息循环,所以WM_TIMER消息应该如何处理呢?综合了下网上找到的资料,写了个简单的demo ...
- MFC的DLL中实现定时器功能
方法一:创建一个线程, 反复读系统时间不就可以了? 如果定时要求不严,用Sleep就可以了.DWORD WINAPI TimerThread(LPVOID pamaram) { UINT oldTic ...
- CAPL基础篇-----CAPL中的定时器操作
前言:使用CPAL往往想要发送周期性的报文这时就需要定时器来完成周期性报文的发送.关于报文的发送,会有下面的章节介绍,本章主要讲解定时器的操作. 1:定时器的种类. 在CAPL中定时器分两种:一种是以 ...
- java怎么加定时器_JAVA WEB程序中添加定时器
JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...
- lwip协议栈中超时定时器实现原理
lwip协议栈中超时定时器实现原理 1,超时定时器存在的目的: tcpip协议中存在很多需要定时处理的任务,包括一次性超时处理和周期性超时处理. 以tcp传输为例,每条连接总共需要建立七个定时器,依次 ...
- 51单片机中的定时器
文章目录 1 51单片机中的定时器介绍 1.1 定时器的初步认识 1.2 定时器的寄存器 1.3 使用定时器的方法 1.4 定时时间的计算 2 定时器模式1 2.1 定时器模式1原理分析 2.2 使用 ...
- linux内核定时器死机,浅析linux内核中timer定时器的生成和sofirq软中断调用流程
浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...
- 嵌入式操作系统内核原理和开发(实时系统中的定时器)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 关于定时器的内容,其实我们之前也讨论过,也书写过相应的代码,但是表达得比较晦涩,效率也比较低. ...
- swoole 类中使用定时器
swoole 类中使用定时器 服务端 server <?php class TimerServer {private $serv;public function __construct() { ...
最新文章
- 【LeanEAP.NET】精益企业应用平台---源码Demo下载
- python网页服务器_python编写简单网页服务器
- Java基础篇:抽象类与接口
- Mac环境下安装Sass
- 160 - 39 damn
- cacti配置流量汇总
- java 二分搜索获得大于目标数的第一位_Java后端架构师技术图谱,你都了解多少?...
- cisco交换机命令大全(11)
- SIFT算法系列之尺度空间
- UA PHYS515A 电磁理论IV 时变电磁场理论4 电磁场的动量与麦克斯韦压缩能张量
- adobe flash java_Adobe 发布最后的 Flash 更新:官方强烈建议立即卸载
- 常见文件文件头文件尾格式总结及各类文件头
- 360Win10的360wifi无速度问题
- 天猫精灵GXIC2020 AIOT物联网大赛获奖了
- Hazelcast IMDG参考中文版手册-第十一章-分布式查询
- 怎么将.tex文件转换成pdf
- 基于vue的todolist案例
- JVM性能调优4_JVM的执行子系统__享学课堂
- 资产管理系统有哪些功能模块和作用
- 再议事理图谱(首届事理图谱研讨会参后感)