定时器回调函数中的奇怪问题?

rferen2003 2004-10-08 02:47:54
下面是一个定时器的回调函数以及调用它的函数:

void CGameApp2View::OnCallback1()
{
SetTimer(1,1000,timeup1);
}


void CALLBACK CGameApp2View::timeup1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
{
CGameApp2View *pWnd; //声明窗口的函数
pWnd=(CGameApp2View*)AfxGetMainWnd(); //取得窗口指针

char buffer [33];
itoa (pWnd->picnum,buffer,10);
::MessageBox(NULL,buffer,"警告",MB_ICONWARNING);


pWnd->picnum++;

if(pWnd->picnum>=3)
{
pWnd->KillTimer(1);
return;
}


}

其中picnum是一个CGameApp2View类中的一个成员变量(int类型的数,初始化为0)
现在我想测试一下在这个定时器的回调函数中picnum的数值如何,就用了上面的代码
现在出现了两个问题:
(1)弹出的数值是6113304,6113305...,而不是0,1,2...
(2) pWnd->KillTimer(1); 这句话不起作用,数值会一直加下去,没有停止,说明
定时器并没有被消灭

这到底是怎么回事?该怎么写那?
请高手指教。
...全文
232 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangng 2004-10-26
  • 打赏
  • 举报
回复

pWnd=(CGameApp2View*)AfxGetMainWnd(); //取得窗口指针
换成
pWnd=(CGameApp2View*)((CMainFrm*)AfxGetMainWnd())->GetActiveView();
看看如何?
rferen2003 2004-10-09
  • 打赏
  • 举报
回复
当然可以编译通过了,就是在一个函数而已
菜牛 2004-10-09
  • 打赏
  • 举报
回复
我糊涂了,这样也能编译通过?
timeup1(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
rferen2003 2004-10-09
  • 打赏
  • 举报
回复
各位果然厉害,我换成CMainFrm就通过了,我想问的是:是不是在Frame所在的类中写回调函数吗?在View中不可以吗?如果View中可以,该怎样象
CGameApp2View *pWnd; //声明窗口的函数
pWnd=(CGameApp2View*)AfxGetMainWnd(); //取得窗口指针
类似的形式取得视图类的指针那?
rferen2003 2004-10-08
  • 打赏
  • 举报
回复
我的回调函数就是在视图类中实现的,那么怎么样才能在获得视图那?
直接用picnum就提示出错
kulukyo 2004-10-08
  • 打赏
  • 举报
回复
up楼上2位兄弟
lizmei001 2004-10-08
  • 打赏
  • 举报
回复
同一
pwnd->picnum没有初始化
不过可能你的CGameApp2View类(应该是cview类)与cmainframe有picnum这个变量
huwei001982 2004-10-08
  • 打赏
  • 举报
回复
一\ 检查pWnd->picnum的初始值, 说不定就是6113304
二\ 可能你的主窗口取错了, CGameApp2View是不是一个视类, 而AfxGetMainWnd()得到的却是主窗口
类的指针, 这样, 你的 KillTimer当然失效了
ljunfa 2004-10-08
  • 打赏
  • 举报
回复
pWnd->KillTimer(1);去掉pWnd->试一试!
dawnwinds 2004-10-08
  • 打赏
  • 举报
回复
在Timer回调函数里,你要判断nIDEvent是否为调用SetTimer的nIDEvent,不判断的话,你即使调用KillTimer还会被调用的。其他的同意楼上的
在编写程序的过程,我遇到了这样的需求:在基于Windows 9x 或 Windows NT4.0 的程序,要求确定键盘、鼠标处于空闲状态的时间。查询了有关资料文档以后,发现Windows 9x和Windows NT4.0 没有提供API或系统调用来实现这样的功能。但是,在Windows 2000提供了一个新的函数:GetLastInputInfo(),这个函数使用结构 LASTINPUTINFO 作为参数: LASTINPUTINFO lpi; lpi.cbSize = sizeof(lpi); GetLastInputInfo(&lpi); 调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 的值便是自上次输入事件发生以后的毫秒数。这个值也就是键盘、鼠标处于空闲状态的时间。可惜的是这个函数只能在Windows 2000使用,Windows 9x 或Windows NT4.0不提供此API函数。那么,如何在Windows 9x 或Windows NT4.0实现GetLastInputInfo()的功能呢?笔者的方法是利用系统钩子对键盘、鼠标进行监控。 Windows的钩子实际上是一个回调函数,当用户有输入动作的时候,Windows要调用这个函数。比较典型的系统钩子应用就是键盘钩子和鼠标钩子: HHOOK g_hHookKbd = NULL; HHOOK g_hHookMouse = NULL; 在Windows,一个系统(相对于一个特定进程而言)钩子必须用一个动态链接库(DLL)来实现。不妨将这个动态链接库命名为IdleUI.dll。 这个动态链接库在Windows 9x和Windows NT4.0 实现了GetLastInputInfo()的功能。IdleUI.dll有三个函数: BOOL IdleUIInit() void IdleUITerm(); DWORD IdleUIGetLastInputTime(); IdleUIInit()是环境初始化函数,IdleUITerm()是环境清理函数,分别在MFC应用程序的InitInstance() 和 ExitInstance()调用它们。当用IdleUIInit()做完初始化后,就可以调用第三个函数IdleUIGetLastInputTime()来获取最后一次输入事件后的时钟。从而实现与GetLastInputInfo()一样的功能。程序TestIdleUI.exe是用来测试IdleUI动态库的,程序调用了IdleUIInit 和 IdleUITerm,同时在程序的客户区间显示键盘、鼠标空闲的秒数。 void CMainFrame::OnPaint() { CPaintDC dc(this); CString s; DWORD nsec = (GetTickCount() - IdleUIGetLastInputTime())/1000; s.Format( "鼠标或键盘空闲 %d 秒。",nsec); CRect rc; GetClientRect(&rc); dc.DrawText(s, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE); } 图一显示了TestIdleUI运行时的情形。 图一 TestIdleUI运行画面 为了连续的显示,TestIdleUI设置刷新定时器间隔为一秒。 void CMainFrame::OnTimer(UINT) { Invalidate(); UpdateWindow(); } 运行TestIdleUI,当键盘和鼠标什么也不做时,可以看到计时器跳动,当移动鼠标或按键时,计时器又恢复到零,这样就实现了对输入设备空闲状态的监控。实现细节请看下面对IdleUI.dll工作原理的描述: 首先调用IdleUIInit ()进行初始化,安装两个钩子:一个用于监控鼠标输入,一个用于监控键盘输入。 HHOOK g_hHookKbd; HHOOK g_hHookMouse; g_hHookKbd = SetWindowsHookEx(WH_KEYBOARD,MyKbdHook,hInst, 0); g_hHookMouse = SetWindowsHookEx(WH_MOUSE,MyMouseHook,hInst, 0); 当用户移动鼠标或按下键盘键时,Windows调用其的一个钩子并且钩子函数开始记录时间: LRESULT CALLBACK MyMouseHook(in
oRTP分析 一:关于oRTP.................................................................................................................................2 二:源代码的构建框架...................................................................................................................2 三:有关时间戳的说明.................东了 结构体外,一个更重要的结构体是 。该结构体即是一个会话 的抽象,与会话相关的各种信息都定义在该结构体上或者能够通过该结构体找到。要使用 逑行娸体数据的传输,需要先创建一个会话,之后所有数据的传输都在会话上完成或 基于会话完成。 结构体的定义如下: Rtpsession ext mask pos inc ssrc candidate inc same ssrc count Iw recv pL cha on pay load tyre changed Telep on network error signa events allocator tp Sessiorlisu lticast ttl multicast loopback data Lng current tev d contribut. ing sources use connect ssrc set 图 可以看到,这是一个非常大的结构体,从侧面说明了要维护的与会话相关的量还是比较多的 关于该结构体的比较详细的说明会在后面给出。 的初始化通过接口 完成,外部获得一个新的 是通过调用接 完成。关」 的其他有关配置和获取信息的操作都叮以在文件 找到定义 使用进行数据传输时,可以在一个任务上完成多个会话流的接收和发送。这得益 调度模块的支持。要使用调度模块,应用需要在进行的初始化时对调度进 行初始化,将需要调度管理的会话注册到调度模块,这样当进行接收和发送操作时,先向 调度询问当前会话是否可以进行发送和接收,如果不能进行收发操作,则处理下一个会话。 这有点类似接口上的操作。调度模块使用的数据结构主要为 ,如下图 所示: Reschedule list all sessions r sessions r max w sessions Wmaⅹ unblock select con thread thread running timer RtpTimer t⊥me state timer inc timer inl t LIe I timer unini t interval 图 保存了所有要处理的会话,的意义类似于,在这里分别代表接收、发送以及 异常 等文件实现了调度模块。 数据在底层实际的接收和发送是通过接凵完成的,这些实现在 文 件 为了方便将移植到不同平台上,实现了对操作系统接口的封装,包括常用的 仼务的创建及销毁,条件变量及互斥锁,进程间的管道通信机制等。这些在文件实 现 狳了操作系统相关的接口外,为了便于内部操作,实现了部分数据结构,一个是双 向链表,在文件;一个是队列,在文件 文件。链表的实现比较简单, 队列的实现相对较复杂一点。首先,队列数据结构由三部分组成:队列头、消息块以及数据 块,图示如下: g stopper gb g count b prev b next b cont datat datab b rptr reserved db freeIn reserved dh ref Buffer 图 上图从左到右依次为队列头,消息块和数据块ε队列头指向消息块,消息块之间可以构成 双向链衣,这是队列的基本要素。消息块本身不带,数据是由专门的数据块来保存的, 并被消息块指向。上图是一个初始化后的状态,消息块的读写指针都指向数据块的 的开始位置。数据块的和指针则分别指向 空间的开始地址和结束地址处。向 写入和读出数据后的状态变化如下图: b pre b next b next b cont b con b datap b rptr db base b rptr db base b wptr db lim b wpt db lim db freen db freef reserve db ref reserved db ref Buffer Buffe 图 除了向队列添加消息块外,上述数据结构设计还支持向个消息块添加新的消息块,这样可 以支持一个消息块保存较人块的数据,如下图所示 b cont b rptr dh base do lim reserv

16,470

社区成员

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

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

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