settimer后 进入不了ontimer函数

baidu_14873583 2014-11-03 10:09:58
代码截取了一部分如下:
Invalidate(TRUE);
PAINTSTRUCT ps;
CDC* pDC = BeginPaint(&ps);
GetClientRect(&m_rect);
OnDraw(pDC);
_mDLDTimeID=SetTimer(2,1000,NULL);//设置时间保存图片
//_mDelayTimeID=SetTimer(4,3000,NULL);
EndPaint(&ps);
//
readPRD("D:\\mmm.dat");

进入不了ontimer函数 直接执行readPRD("D:\\mmm.dat");在readPRD("D:\\mmm.dat");函数体里这样设置
Invalidate(TRUE);
PAINTSTRUCT ps;
CDC* pDC = BeginPaint(&ps);
GetClientRect(&m_rect);
OnDraw(pDC);
_mDLDTimeID=SetTimer(2,1000,NULL);//设置时间保存图片
//_mDelayTimeID=SetTimer(4,3000,NULL);
EndPaint(&ps);
//
没有后面的代码就能进入ontimer函数,请问是怎么回事?急等
...全文
501 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-12-19
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
没准少消息映射
全凭瞎猜也能得分。
向立天 2014-12-03
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
向立天 2014-12-03
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
赵4老师 2014-12-03
  • 打赏
  • 举报
回复
没准少消息映射
xiaohuh421 2014-11-03
  • 打赏
  • 举报
回复
首先你要知道SetTimer的一个特性. 就是后一次SetTimer的调用会清除前一次调用, (在ID相同的情况下). 比如下面的例子: SetTimer(123, 3000,NULL); 然后过了2.5秒, 你又调用了 SetTimer(123, 3000,NULL); 这时, 定时器会重新等待3秒才会发出WM_TIMER消息, 也就是前一次定时被清掉了, 或者说叫重新初始化了. 而你这里面, 可能就正好是这种情况. 因为你在OnPaint中执行了SetTimer, 可能这个OnPaint又在不停的执行, 这就导致定时器被不停的重新初始化, 然后就永远都不响应了.
baidu_14873583 2014-11-03
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
在 SetTimer 设置个断点 看看程序是否执行到了这里 WM_TIMER 的优先级很低, 只要消息队列里非空, WM_TIMER 就不会被投递 参考 高精度多媒体时钟应用类
执行到了SetTimer 现在我是调试一步一步走的话 能进ontimer 但是直接执行 就进去不了ontimer了
zgl7903 2014-11-03
  • 打赏
  • 举报
回复
在 SetTimer 设置个断点 看看程序是否执行到了这里 WM_TIMER 的优先级很低, 只要消息队列里非空, WM_TIMER 就不会被投递 参考 高精度多媒体时钟应用类
baidu_14873583 2014-11-03
  • 打赏
  • 举报
回复
引用 3 楼 jianghandaxue 的回复:
定时器可以在程序初始化时设置上去,试下
我主要要保存很多数据图片的 所以是每次读完数据后 然后显示 然后再保存下来的 ontimer里就是保存图片的哈
jianghandaxue 2014-11-03
  • 打赏
  • 举报
回复
定时器可以在程序初始化时设置上去,试下
baidu_14873583 2014-11-03
  • 打赏
  • 举报
回复
引用 1 楼 shen_wei 的回复:
SetTimer(2,1000,NULL);// 你放在Create中。。
我主要是读取数据后要在窗口自动显示数据图片 然后保存下来 所以才又重新写了下BeginPaint;前提是我如果没有后面的readPRD("D:\\mmm.dat");就能进入ontimer函数里 请问这是怎么回事?
shen_wei 2014-11-03
  • 打赏
  • 举报
回复
SetTimer(2,1000,NULL);// 你放在Create中。。
shenyi0106 2014-11-03
  • 打赏
  • 举报
回复
1. 在OnInitDialog或者OnCreate中执行SetTimer 2. 添加ON_TIMER()
baidu_14873583 2014-11-03
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
首先你要知道SetTimer的一个特性. 就是后一次SetTimer的调用会清除前一次调用, (在ID相同的情况下). 比如下面的例子: SetTimer(123, 3000,NULL); 然后过了2.5秒, 你又调用了 SetTimer(123, 3000,NULL); 这时, 定时器会重新等待3秒才会发出WM_TIMER消息, 也就是前一次定时被清掉了, 或者说叫重新初始化了. 而你这里面, 可能就正好是这种情况. 因为你在OnPaint中执行了SetTimer, 可能这个OnPaint又在不停的执行, 这就导致定时器被不停的重新初始化, 然后就永远都不响应了.
我复制的时候没有认真看哈 settimer的ID不同哈 我设置了几个定时器的哈 发现只有某一两个能执行 我按照你的意见 还是没找到解决方法的
VC++常用函数一应俱全 内容举例: 在状态栏中添加时间 1)在String Table中添加New String,在此定义为ID_INDICATOR_CLOCK, 将其Caption设为00:00:00(由于状态栏根据Caption确定时间窗格的缺 省宽度,使用此值将为时间的显示预留空间)。注 2)在MainFrm.cpp中indicators声明处添加ID_INDICATOR_CLOCK,代 码如下:   这一步中ID_INDICATOR_CLOCK的插入位置将影响时间窗格在状态栏中 的显示位置。   3)安装定时器:在MainFrm.cpp中OnCreate函数处添加代码如下:   int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   { ……   SetTimer(1,1000,NULL);//安装定时器,并将其时间间隔设为1000毫秒   return 0;   }   4)编写时间处理函数:利用ClassWizard为CMainFrame类加入WM_TIMER 的消息处理函数OnTimer,并添加代码如下:   void CMainFrame::OnTimer(UINT nIDEvent)   {// TODO: Add your message handler code here and/or call default   CTime time;   time=CTime::GetCurrentTime();//得到当前时间   CString s=time.Format(″%H:%M:%S″);//转换时间格式,这里格式一定要大写   m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIn-   dex(ID_INDICATOR_CLOCK),s); //显示时钟   CFrameWnd::OnTimer(nIDEvent);}   5)销毁定时器:利用ClassWizard为CMainFrame类加入WM_CLOSE的消息处理   函数OnClose,并添加代码如下:   void CMainFrame::OnClose()   {// TODO: Add your message handler code here and/or call default   KillTimer(1);//销毁定时器

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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