转自博客:http://www.cnblogs.com/phinecos/archive/2008/03/08/1096691.html

作者:洞庭散人

“我现在项目是一个控制台程序,用到的Win32API都是与界面无关的,今天需要加入定时器刷新的功能,由于没有消息循环,所以WM_TIMER消息应该如何处理呢?综合了下网上找到的资料,写了个简单的demo,个人以为这种在一个线程中创建定时器,再通过指定的回调函数来处理定时器触发的模式是比较好的。”

demo:

#include <Windows.h>
#include <stdio.h>
#include <conio.h>

int count = 0;

void CALLBACK TimerProc(HWND hWnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
 count++;
 printf("WM_TIMER in work thread count=%d/n",count);
}

DWORD CALLBACK Thread(PVOID pvoid)
{
 MSG msg;
 PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);
 UINT timerid = SetTimer(NULL,111,3000,TimerProc);
 BOOL bRet;
 while ((bRet = GetMessage(&msg,NULL,0,0))!=0)
 {
  if (bRet == -1)
  {
   printf("Error:the thread will quit,error id is %d/n",GetLastError());
   break;
  }
  else
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }
 KillTimer(NULL,timerid);
 printf("thread end here/n");
 return 0;
}

int main()
{
 DWORD dwThreadID;
 printf("use timer in workthread of console application/n");
 HANDLE hThread = CreateThread(NULL,0,Thread,NULL,0,NULL);
 _getch();
 return 0;
};

本人在了解了作者的意图以后,也做了一个类封装:

#include <Windows.h>
#include <stdio.h>
#include <conio.h>

class CTimer
{
public:
 CTimer();
 void CreateTimerThread(int* pi);
 static DWORD CALLBACK TimeThread(PVOID pvoid);
 static void CALLBACK TimeProc(HWND hWnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);
};

CTimer::CTimer()
{
}

void CTimer::CreateTimerThread(int* pi)
{
 HANDLE hand = CreateThread(NULL,0,CTimer::TimeThread,pi,0,NULL);
}

DWORD CALLBACK CTimer::TimeThread(PVOID pvoid)
{
 int* pi = (int*)pvoid;
 int itm = *pi;
 MSG msg;
 PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);
 UINT timeid = SetTimer(NULL,111,itm,CTimer::TimeProc);
 BOOL bRet;
 while ((bRet = GetMessage(&msg,NULL,0,0))!=0)
 {
  if (bRet == -1)
  {
   printf("Error:the thread will quit,error id is %d/n",GetLastError());
   break;
  }
  else
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }
 KillTimer(NULL,timeid);
 printf("thread end here/n");
 return 0;
}

void CALLBACK CTimer::TimeProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
 printf("WM_TIMER in work thread count/n");
}

int main()
{
 int iTime = 1000;
 int* pi = &iTime;
 CTimer* ptime = new CTimer;
 ptime->CreateTimerThread(pi);
 _getch();
 return 0;
};

感谢洞庭散人...

C++控制台程序中使用定时器的更多相关文章

  1. 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...

  2. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  3. 让你提前认识软件开发(21):C程序中的定时器

    版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议.欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...

  4. 在控制台程序中,添加config文件

    一.右击类库 → 添加 → 新建项 → 应用程序配置文件(或者选择一个XML文件,然后将名字改成XXX.config),内容如下: <?xml version="1.0" e ...

  5. 将CodedUI Test 放到控制台程序中,模拟鼠标键盘操作

    CodedUI Test是微软的自动化测试工具,在VS中非常好用.可以用来模拟鼠标点击,键盘输入.但执行的时候必须要用mstest调用,无法传入参数(当然可以写入config文件中,但每次修改十分麻烦 ...

  6. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  7. .net core控制台程序中使用原生依赖注入

    如果要在程序中使用DbContext,则需要先在Nuget中安装Microsoft.EntityFrameworkCore.SqlServer using ConsoleApp1.EntityFram ...

  8. C#控制台程序中处理2个关闭事件的代码实例

    我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我们不希望用户通过Ctrl+C终止我们的程序,就需要对Ctrl+C或关闭事件作处理. 处理方法 在.net平台下C ...

  9. 9 在C#控制台程序(console)中让用户输入

    经过前面那些练习,我们已经熟悉录入一些简单的代码.这些代码可以进行一些简单的运算,在dos窗口打印出一些东西出来.我们现在要开始学习如何把数据从外部输入到我们的程序中. 其实大多数程序的工作是完成下面 ...

随机推荐

  1. 纯js写图片轮播插件

    最近终于写成了自己创作的图片轮播插件,使用原生js编写.与目前网上流行的轮播插件相比,功能和效果稍弱,但是使用起来相当方便. 先看html代码 <!DOCTYPE html> <ht ...

  2. sublime text3输入中文的问题.

    1.新建sublime_imfix.c文件 里面输入: /* * sublime-imfix.c * Use LD_PRELOAD to interpose some function to fix ...

  3. action方法不返回

    当被请求的action方法中还有资源没有释放时,请求方法是不会返回的,会一直停留在方法中,即使是最后一行,因为请求方法一旦返回,那方法中的资源,引用就没有位置住了,所以所请求的方法会一直不返回,直到方 ...

  4. springmvc中url-pattern的大坑

    <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springfr ...

  5. ios paper for facebook 使用第三方库

    facebook paper使用的第三方库 Facebook Paper使用的第三方库 第三方库名 简介 链接 ACE code editor https://github.com/ajaxorg/a ...

  6. Objective-C 中的方法回掉

    Objective-C 中的方法回掉  Objective-C 中的方法调用 OC 类似C+,避免不了的内部的各种通信手段,函数调用,变量传递等,避免不了各种回掉等. 一.class直接调用 或者 o ...

  7. scrapy, 自带命令行调用工具.

    #-*- coding:utf-8 -*- from scrapy import cmdline cmdline.execute("scrapy crawl dmoz".split ...

  8. Mac OS 安装 Port

    简介 MacPorts类似与apt-get以及yum等软件包管理工具,可以方便的进行安装与卸载软件的功能,同时可以自动安装软件包的依赖,非常方便,同类的还有brew等工具. 安装 下载MacPorts ...

  9. Scala - 正则表达式匹配例子

    壹Try胜仟言 别忘了 import scala.util.matching._ scala> var s = "a_b_c_d_e"s: String = a_b_c_d_ ...

  10. overflow之锚点技术实现选项卡

    我们知道通过锚点技术可以实现页面内容的定位,如果我们把这些内容放置在一个容器中,看看我们能做什么.       艾玛,选项卡.轮播,有木有,瞬间有种蛋碎的赶脚,以前写个选项卡,破轮播,费了多大的劲儿呀 ...