VC定时执行任务

VC定时执行任务

flyfish  2015-1-19


SetTimer


Windows把在消息队列里的多个WM_TIMER消息组合成一条消息,应用程序并不知道有多少个这样的WM_TIMER在这个过程丢失了, 这些消息不是精确的时钟滴答中断.此消息的优先级过低,而且不精确 ,因此不适合做任务处理。


使用timeSetEvent

头文件支持

#include <MMSystem.h>
#pragma comment(lib, "winmm.lib")


类中声明函数
static void CALLBACK Function(UINT wTimerID,UINT nMsg,DWORD dwUser,DWORD dw1,DWORD dw2);


类中函数实现
void ClassName::Function(UINT wTimerID,UINT nMsg,DWORD dwUser,DWORD dw1,DWORD dw2)
{
ClassName* pDlg=(ClassName*)dwUser;
}

调用方式
int nTimeID=timeSetEvent(100,100,Function,(DWORD)this,TIME_PERIODIC);

释放定时器资源 

 timeKillEvent(nTimeID);



函数解释
MMRESULT timeSetEvent(
  UINT           uDelay,     
  UINT           uResolution,
  LPTIMECALLBACK lpTimeProc, 
  DWORD_PTR      dwUser,     
  UINT           fuEvent     
);




参数说明


uDelay
事件延迟,毫秒。如果这个值不在定时器支持的最小和最大延时之间的话,函数将返回一个错误。
uResolution
定时器的分辨力,毫秒。
lpTimeProc
指向回调函数的指针。
dwUser
用户提供的回调函数数据


返回值
如果成功返回定时器事件的一个标识符,否则返回一个错误。如果它失败了,这个函数返回NULL,定时器事件不会被创建。(这个标识符同样会被传递给回调函数)


使用Boost实现


头文件支持
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

类中的函数声明
void BoostOnTimer(const boost::system::error_code& /*e*/,
boost::asio::deadline_timer* t,UINT nElapse);
void BoostSetTimer(UINT nElapse );

类中的函数实现
void ClassName::BoostOnTimer(const boost::system::error_code& /*e*/,
	boost::asio::deadline_timer* t,UINT nElapse)

{
	
//任务执行

//终止条件 
	
t->expires_at(t->expires_at() + boost::posix_time::milliseconds(nElapse));
	
t->async_wait(boost::bind(&ClassName::BoostOnTimer,this,boost::asio::placeholders::error, t,nElapse));

}




void ClassName::BoostSetTimer(UINT nElapse )//毫秒

{
	
boost::asio::io_service io;
	
boost::asio::deadline_timer t(io, boost::posix_time::milliseconds(nElapse));
	
t.async_wait(boost::bind(&ClassName::BoostOnTimer,this,boost::asio::placeholders::error, &t, nElapse));
	
io.run();

}		


调用方式 BoostSetTimer(3000);

一般bind的使用boost::bind(函数名, 参数1,参数2,...)
如果是类就要使用boost::bind(&类名::函数名,类实例指针,参数1,参数2,...)
非静态成员函数都有一个隐式的this,因为使用的是类的非静态成员函数 所以需要把this作为参数bind到成员函数
t.async_wait()是异步等待,如果是t.wait() 则是阻塞等待

t->expires_at(t->expires_at() + boost::posix_time::milliseconds(nElapse));

是在原来的终止时间上增加延时



你可能感兴趣的:(定时器,boost)