控制台中使用SetTimer的提醒

SetTimer是设置定时器,每隔一段时间执行一个操作,原型如下

  UINT_PTR SetTimer(

  HWND hWnd, // 窗口句柄

  UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器

  UINT uElapse, // 时间间隔,单位为毫秒

  TIMERPROC lpTimerFunc // 回调函数

  );

它是通过分发WM_TIMER消息来触发回调函数的,看下面代码

[cpp] view plaincopy

  1. void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
  2. {
  3. printf("%s","abc");
  4. }
  5. void main()
  6. {
  7. SetTimer(0, 0, 1000, &TimerProc);
  8. }

你认为上面的代码会正确执行吗,答案是不会,回调函数根本得不到执行。因为虽然使用了SetTimer,但是没有对WM_TIMER消息进行分发,所以不会触发回调函数,我们修改如下

[cpp] view plaincopy

  1. void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
  2. {
  3. printf("%s","abc");
  4. }
  5. void main()
  6. {
  7. SetTimer(0, 0, 1000, &TimerProc);
  8. MSG   msg;
  9. while(GetMessage(&msg,NULL,0,0))
  10. {
  11. if(msg.message==WM_TIMER)
  12. {
  13. DispatchMessage(&msg);
  14. }
  15. }
  16. }

OK,看到上面的while循环了吗,这里就是获取每秒钟发出的WM_TIMER消息,并分发下去,通知回调函数开始执行。

参考:http://blog.csdn.net/bdmh/article/details/6371443

经测试可行,完整代码:

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
  printf("%s","abc");

}
void main()
{
    SetTimer(0, 0, 1000, &TimerProc);
    MSG   msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        if(msg.message==WM_TIMER)
        {
            DispatchMessage(&msg);
        }
    }
}

如果这样写:

MSG msg;
GetMessage(&msg, NULL, 0, 0);

这样消息队列是有了,但是没有人分发消息那还是不行,不会执行TimerProc的内容的。

----------------------------------------------------------------------------------------------

Delphi版本:

时间: 2024-10-11 18:20:00

控制台中使用SetTimer的提醒的相关文章

Jenkins控制台中乱码问题

由于服务器环境及应用层各版本的不同.编码方式的不同因此会有很多种情况会出现乱码问题. 由于Jenkins中的job运行的是独立的一个shell环境,许多的环境变量与服务器中是不一样的,因此在job中执行的命令也就会有所差异. 因此可以在job中执行env命令,同时在服务器中执行env命令查看环境的异同点. 对于Jenkins中乱码问题,首先,确保Jenkins的容器如Glassfish,Tomcat的编码是正确的,已设置成如UTF-8编码. 若还有乱码,做如下尝试: 系统管理--系统设置,添加编

C# 计算字符串在控制台中的显示长度

C# 计算字符串在控制台中的显示长度? 警告 您当前查看的页面是未经授权的转载! 如果当前版本排版错误,请前往查看最新版本:http://www.cnblogs.com/qin-nz/p/csharp-calculate-string-display-length.html 提示 更新时间:2016年01月09日. 本作品由勤奋的小孩创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可. 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接( http

百度 主页中在控制台中

try{ if(window.console&&window.console.log) {console.log("一张网页,要经历怎样的过程,才能抵达用户面前?\n 一位新人,要经历怎样的成长,才能站在技术之巅?\n 探寻这里的秘密:\n 体验这里的挑战:\n 成为这里的主人:\n 加入百度,加入网页搜索,你,可以影响世界.\n"); console.log("请将简历发送至 %c [email protected]( 邮件标题请以“姓名-应聘XX职位-来自

利用跨域请求来隐藏firbug控制台中的Ajax请求

普通jquery的Ajax请求在控制台中是可见的,如下: 而在利用jsonp(json with padding)进行Ajax跨域时,发现Ajax请求不会在控制台显示. 跨域代码如下: 前端代码: $.ajax({ type : "get", //jquey不支持post方式跨域 async:false, url : "http://www.cnblog.com", //跨域请求的URL dataType : "jsonp", //传递给后端,用

转:在控制台中调试AngularJS应用

在控制台中调试AngularJS应用 在创建AngularJS应用时,一个很棘手的问题是如何在Chrome,Firefox,以及IE的JavaScript控制台中访问深藏在应用中的数据和服务.本文将会介绍一些如何从JavaScript控制台中监视和控制AngularJS应用的小技巧,来帮助你更加轻松的对AngularJS进行实时的测试修改. 1:访问作用域 我们可以使用一行简单的JS代码来访问任何作用域(甚至是独立的作用域): > angular.element(targetNode).scop

从控制台中读取密码 - C#

Tip :    从控制台中读取密码 语言: C# ______________________________________________________________ 在登陆Linux系统的时候,体验过在Linux的shell命令行窗口中输入用户密码吗? 下面体验下在Windows控制台中输入密码的方式 Showing  Effect SourceCode /// <summary> /// Read password from console /// </summary>

关于 JavaScript 中一个小细节问题 (在控制台中直接 {} 对象报错问题)

在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象  ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚好看到博客园有博友文章,顺便记录一下. 在 JavaScript 中, : 有三种作用,想必大家都知道,其一  三元表达式  true? A:B,其二 在 switch case 中 case 语句中会用到,其三 就是上图中,对象直接量表达式中. 其实 ,在 JS 中,: 还有一种用法,如下所示,内

在 C# 控制台中记录异常日志并输出

最近做了一个小程序,要求在控制台中记录程序运行的异常并输出到指定的文件夹中,以下是我的具体的程序代码: public static void ErrorLog(Exception ex) { string FilePath = "/ErrorLog.txt"; StringBuilder msg = new StringBuilder (); msg.Append("*************************************** \n"); msg.

在控制台中调试 AngularJS 应用(译/改)

当我们在编写 AngularJS 的应用时,通过 Chrome, Firefox, 和 IE 的 Javascript 控制台来获取隐藏在应用之中的数据(Data)和服务(Service) 是一件非常具有挑战性的工作.下面列出了一些简单的小窍门,可以帮助我们使用 Javascript 控制台来监视和控制一个正在运行的 Angular 应用,使其更加容易测试.修改甚至是实时的编写 Angular 应用. 1: 获取 Scopes (作用域) 我们可以使用一行 JS 代码来获取任何的 Scope (