今天看到一个问题
struct T
{
void foo()
{
nTimer=::SetTimer(0,0,100,&time_proc);
}
static void __stdcall time_proc(HWND,UINT,ULONG_PTR,DWORD)
{
//这里要调用 fire_timer_event
}
void fire_timer_event(HWND,UINT,ULONG_PTR,DWORD)
{}
private:
ULONG_PTR nTimer;
};
一种解决办法是使用全局变量:
T* g_t;
...
void foo()
{
g_t=this;
nTimer=...
}
time_proc(...)
{
g_t->fire_timer_event(...);
}
这种方法要引入一个全局变量,不爽
另外一种是将this指针的值作为idEvent的参数:
void foo()
{
nTimer=::SetTimer(0,(ULONG_PTR)this,100,&time_proc);
}
time_proc(,ULONG_PTR idEvent,...)
{
T* pThis=(T*)idEvent;
pThis->fire_timer_event(...);
}
这种方法解决了全局变量的问题,不过,如果这个对象需要多个Timer呢?
对象要维护多个Timer,那么需要多个TimerId,
struct T
{
void foo()
{
ULONG_PTR* p=new ULONG_PTR;
*p=(ULONG_PTR)this;
ULONG_PTR id=::SetTimer(0,(ULONG_PTR)p,...);
_ids.push_back(std::makr_pair(id,p));
}
time_proc(,ULONG_PTR idEvent,...)
{
ULONG_PTR* p=(ULONG_PTR*)idEvent;
T* pThis=(T*)*p;
pThis->fire_timer_event(...);
}
~T()
{
for(std::list<std::pair<ULONG_PTR,ULONG_PTR*> >::iterator it=_ids.begin();
it!=_ids.end();++it)
{
delete (it->second);
}
}
private:
std::list<std::pair<ULONG_PTR,ULONG_PTR*> > _ids;
};
转自:http://blog.vckbase.com/netsin/archive/2005/06/29/8980.html#FeedBack