注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[win32] 关于 Timer (1) -- SetTimer 其实可以不依赖 hWnd  

2013-09-30 14:09:48|  分类: win32 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
早期用 SetTimer(),都是利用 WM_TIMER 来做回调。其实 SetTimer() 可以不传入 hWnd 的(以前没注意)。
下面用一个 Console App 来演示下:(VS2010)

// SmallTimer.hpp
#pragma once

#include <Windows.h>
#include <functional>

class SmallTimer
{
public:
  SmallTimer(float interval, std::function<void()> func);
  ~SmallTimer();

  void start();
  void stop();

private:
  static VOID CALLBACK timerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);

private:
  ULONG_PTR handle_;
  float interval_;
  std::function<void()> func_;
};


// SmallTimer.cpp
#include "SmallTimer.hpp"
#include <unordered_map>

static std::tr1::unordered_map<ULONG_PTR, SmallTimer*> g_timerMap;

SmallTimer::SmallTimer(float interval, std::function<void()> func) :
  handle_(0),
  interval_(interval),
  func_(func)
{
}

SmallTimer::~SmallTimer()
{
  stop();
}

void SmallTimer::start()
{
  stop();

  UINT elapse = static_cast<UINT>(interval_ * 1000);
  handle_ = ::SetTimer(NULL, 0, elapse, timerProc);

  g_timerMap[handle_] = this;
}

void SmallTimer::stop()
{
  if (handle_)
  {
    g_timerMap.erase(handle_);

    ::KillTimer(NULL, handle_);
    handle_ = 0;
  }
}

VOID CALLBACK SmallTimer::timerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
  auto it = g_timerMap.find(idEvent);
  if (it != g_timerMap.end())
  {
    it->second->func_();
  }
}


// main.cpp
#include "SmallTimer.hpp"

int main()
{
  SmallTimer tmr1(1.0f, [](){
    printf("timer1: %d\n", GetCurrentThreadId());
  });
  SmallTimer tmr2(5.0f, [](){
    printf("timer2: %d\n", GetCurrentThreadId());
  });

  tmr1.start();
  tmr2.start();

  MSG msg;
  while (GetMessage(&msg, NULL, 0, 0))
  {
    DispatchMessage(&msg);
  }
  return 0;
}

唯一要注意的是,整个 timer 的驱动,还要依赖 GetMessage/DispatchMessage。
1. 每个 timer 拥有独立的 callback func (SetTimer()设置的)
2. callback 回调的 thread 就是 DispatchMessage 的 thread
  评论这张
 
阅读(960)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017