定时回调函数 访问类非静态成员的问题

musiclov 2011-11-09 04:12:40
类的一个静态函数
CALLBACK MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
作为定时回调函数。

通过定义一个静态类指针pThis可以访问类非静态成员的问题,但只适合于只有一个类的实例的情况。

还是一个较好的解决方案是用映射表存所有对象地址的方法,类似于

typedef CMap<UINT,UINT,A*,A*> CAMap;
class A()
{
static void a(); //静态回调函数
void b(); //非静态函数
int m_ID; //本对象在列表中的ID号
static CAMap m_Map; //静态对象映射表
}

CAMap A::m_Map;


A::A() //构造函数中将this指针赋给pThis,使得回调函数能通过pThis指针访问本对象
{

m_ID=m_Map.GetCount()+1;
m_Map.SetAt( m_ID, this );
}
void A::a()
{
A * pThis=NULL;
m_Map.Lookup(m_ID?????,pThis);
{
pThis->b(); //回调函数中调用非静态函数
};


问题来了,m_Map.Lookup(m_ID?????,pThis);这里,怎么通过键找到对象指针?直接访问m_ID是不行的,m_ID又是类非静态成员,似乎进入了一个死循环。问题的实质是怎么设置一个键,这个键静态的映射表又能有效访问到,望指教。
...全文
92 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
musiclov 2011-11-10
  • 打赏
  • 举报
回复
经测试,利用SetTimer返回的ID确实可以实现:


int a=SetTimer(......);
m_Map.SetAt(a, this );

在TimeProc里,

void A::TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
A * pThis=NULL;
m_Map.Lookup(idEvent,pThis);
pThis->
}

经测试,确实可以了,多谢指教!
ouyh12345 2011-11-09
  • 打赏
  • 举报
回复
map里的m_ID是SetTimer函数的返回值
这样,在回调函数里,通过idEvent来获得类的this指针
musiclov 2011-11-09
  • 打赏
  • 举报
回复
非窗口类,HWND hwnd,UINT uMsg这两个参数用不了啊。
ouyh12345 2011-11-09
  • 打赏
  • 举报
回复
用hwnd发消息行不?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧