| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4369 人关注过本帖
标题:SetTimer的回调函数问题
只看楼主 加入收藏
fjlangzi
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2008-1-2
收藏
 问题点数:0 回复次数:5 
SetTimer的回调函数问题
我要设计一个类A,通过这个类定义不同的对象,不同的对象通过SetTimer函数设定相应
的定时器,然后在各自的回调函数中执行不同的内容,例如用MessageBox显示不同的字
符,这个字符由A的内容是该类的一个成员变量CString s。
   但是回调函数必须是全局函数或者是静态函数(我在代码中将函数设为静态成员函
数),静态函数又只能访问静态变量,所以必须把这个成员改成静态变量static CString s;

变量的值通过构造函数传递。
现在我用A类定义两个对象
A a("a");
A b("b");
按照我的预期应该这样,MessageBox中的字符应该是“a” 和“b”交替出现。可是现在
的情况是只出现“b”,也就是说Static CString s成了所以对象共有的,后面定义的对
象的s覆盖了前面的s。那我这样的情况该怎么做呢?


期待高手的解答,谢谢!
搜索更多相关主题的帖子: SetTimer 回调 函数 
2008-03-01 18:44
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
贴一下你的代码.看字看了半天,没明白...不好意思
2008-03-01 18:48
fjlangzi
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2008-1-2
收藏
得分:0 
1.类的定义部分
class CBall  
{
public:
    CBall(CString id);
    virtual ~CBall();
static VOID CALLBACK MyTimerProc(//此处用的静态函数,因为SetTimer的回调函数要求//静态或者全局函数
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
);
private:
    static CString strID;// 因为静态函数要访问该变量,所以将该变量也设为静态变量
};
2.类的实现部分
CBall::CBall(CString id)
{
    strID = id;
    ::SetTimer(NULL,1,1000,(TIMERPROC)MyTimerProc);
}
VOID CALLBACK CBall::MyTimerProc(
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
)
{
    AfxMessageBox(strID,MB_OK | MB_ICONINFORMATION);
}
3.在其他地方使用该类
    CBall  a(“a”);
Cball  b(“b”);
4.分析
我的预期是要让两个对话框分别弹出对话框,分别显示“a”和“b”。可是实际显示的都是“b”。也就是静态变量被共享了,后定义的对象b的strID,将a中的strID覆盖了。

5.如果要达到我的预期目标该怎么做,谢谢了!

[[it] 本帖最后由 fjlangzi 于 2008-3-1 22:18 编辑 [/it]]
2008-03-01 22:16
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
在定时器放在视图类里面,同时自己写个消息映射。处理时间事件。在这个事件里面,你可以实例对象。处理手段很多

[[it] 本帖最后由 sunkaidong 于 2008-3-1 23:22 编辑 [/it]]
2008-03-01 23:13
fjlangzi
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2008-1-2
收藏
得分:0 
谢谢,我好好琢磨一下
2008-03-02 00:56
fjlangzi
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2008-1-2
收藏
得分:0 
可是,我的目的是想要做一个运动小球的类,与窗口无关,在该类里面自己处理小球的移动事件。在要用到的地方直接用该类定义对象就行了,所以不想通过窗口来捕捉Timer消息,这个该咋办呢?
2008-03-02 01:02
快速回复:SetTimer的回调函数问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035094 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved