转载一个

今天看到一个问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值