一个很有意思的关于timer的问题
一个很有意思的发现,
下面是一个最简单的建立窗口,
并设置timer的程序,
大家可能不信,
只要把onpoint()里的CPaintDC dc(this);删去
ontimer就不执行了,
我不知道为什么,
大家那们高人可以给出答案
IMPLEMENT_DYNCREATE(CanvasForm, CFrameWnd)
CanvasForm::CanvasForm()
{
Create(NULL,"hello");
}
CanvasForm::~CanvasForm()
{
}
BEGIN_MESSAGE_MAP(CanvasForm, CFrameWnd)
//{{AFX_MSG_MAP(CanvasForm)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CanvasForm message handlers
void CanvasForm::OnPaint()
{
CPaintDC dc(this);
}
void CanvasForm::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TRACE("\n\nHELLO\n\n");
//MessageBox("hello");
CFrameWnd::OnTimer(nIDEvent);
}
int CanvasForm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
SetTimer(1,100,NULL);
TRACE("SETTIMER");
// TODO: Add your specialized creation code here
return 0;
}
问题点数:20、回复次数:9Top
1 楼afantict(非洲土狼)回复于 2003-12-03 10:03:14 得分 0
你是怎么判断定时器不工作的?
你若在void CanvasForm::OnTimer(UINT nIDEvent) 加断点
就经过一次
以后就不经过了吗?
Top
2 楼bohut(●伯虎● )回复于 2003-12-03 10:06:43 得分 0
定时器响应函数里要首先关闭定时器,然后再打开Top
3 楼findcsdn(searchcsdn)回复于 2003-12-03 10:20:04 得分 10
是这样子的,如果不写如果不处理wm_paint的消息的默认处理,消息环就会无休止的发送wm_paint,导致cpu占用率100%,而且timer消息级别比较低,所以总是不能发送出来,其实是工作的。Top
4 楼ddddh(叶君临)回复于 2003-12-03 10:22:26 得分 10
哥们,这分我要了
给你一点提示,MSDN上面关于WM_TIMER有这么一段话:
The WM_TIMER message is a low-priority message. The GetMessage and PeekMessage functions post this message only when no other higher-priority messages are in the thread's message queue.
TIMER消息是一个低优先级的消息。只有当没有其他高优先级的消息的时候,才会被发送
好,你在onpaint函数里面如果不调用CPaintDC dc(this),而且你也没有调用基类的OnPaint,那么窗口的InvalidRect始终存在,也就是系统会不断地发送WM_PAINT消息给你的窗口,那么你的WM_TIMER消息永远不会被Dispatch,SO,你会发现ONTIMER只被调用了一次。
验证这一点很简单,你把SetTimer第三个参数给一个回调函数,这个函数会被调用很多次,说明很多个Timer消息已经被产生。只是你刚才不dispatch而已Top
5 楼ddddh(叶君临)回复于 2003-12-03 10:23:37 得分 0
原来楼上的已经回答了,刚才没看见
不过需要楼上说的需要纠正的是,并非什么cpu占用100%,而是timer的优先级很低的原因。呵呵Top
6 楼flyback(墨羽)回复于 2003-12-03 10:36:22 得分 0
msdn曾经警告过不要在onpaint 中加Getdc之类的操作Top
7 楼fuxf(布衣)回复于 2003-12-03 10:42:55 得分 0
同意各位任兄的见解.Top
8 楼za1mb2yc3(无名)回复于 2003-12-03 23:01:22 得分 0
为什么onpoint如果什么都不写就会不断发送wm_point消息
这是一个新手,对消息处理不是特别明白,
msdn太大不从哪看起
wm_paint是谁发的呢?Top
9 楼Healer()回复于 2003-12-03 23:50:32 得分 0
ddddh(叶君临) 不错, 学习了:)Top




