CListView继承的类中OnTimer事件为何不能定时执行?程序基于MFC/SDI,CTestView继承于CListView。
部分代码:
//OnTimer事件均定义了消息映射和响应声明,响应函数如下
void CTestView::OnTimer(UINT nIDEvent)
{
         ...
CListCtrl& lc = GetListCtrl();
CString szValue;
CTime time_cur= CTime::GetCurrentTime();
szValue.Format("%02d:%02d:%02d",time_before.GetHour(),time_before.GetMinute(),time_before.GetSecond());
nItem =lc.InsertItem(0,szValue);
         ...
CListView::OnTimer(nIDEvent);
}
Timer事件在OnCreate(LPCREATESTRUCT lpCreateStruct)中SetTimer,
在OnDestroy()中KillTimer现象:程序运行开始时在CTestView添加了两行记录,接着就没反应
点击ListCtrlItem会不定期地响应,时间间隔各不一样。问题:
(1)CTestView中关于ListCtrl的初始化或者Insert操作出错?但照搬到基于MFC/CDialog的程序中,一切正常
(2)CTestView接收消息是否先经由CMainFrame处理?是否需要CMainFrame接收到消息再传递给CTestView?
(3)OnTimer的执行为什么断断续续?请高手赐教

解决方案 »

  1.   

    CListView::OnTimer(nIDEvent);去掉
      

  2.   

    一般将Timer放在Frame类中,Doc/view 架构是一个模板,3个类一般只将Timer放在Frame类里,
    如果把CListView::OnTimer(nIDEvent);去掉就不会定时监控Timer,执行不会按你设定的时间
    执行了不到一秒就可能执行一次OnTimer.
    3个类一般使用一个OnTimer函数,多任务可以用SetTimer(1,1000,NULL); SetTimer(2,1000,NULL);...
    在OnTimer中判断是哪个Timer可以用switch(nIDEvent)... case 来看你在哪里set的Timer
      

  3.   

    1,初始化在InitDialog中
    用MainFram的定时器,可以通过不同的ID来区分定时器
    有时,系统资源紧张时,定时器就可能不准确
      

  4.   

    如csnew所说,去掉CListView::OnTimer(nIDEvent)响应特别快,无法定时。
    这是为什么呢?CListView::OnTimer(nIDEvent)究竟干了些什么?是否起到了从Message Queue中及时去掉该消息事件的作用?对于View/Doc机制不是很懂,CView继承的类的Onclose,Onsize消息都没有反应,该如何使用View 里面的这些事件?
    我本希望每隔1秒在视图CTestView中添加一条消息,在CTestView::OnTimer(nIDEvent)添加应该直接的多,但并未达到期望效果。多谢各位指点,我转到CMainFrame的OnTimer调用CTestView的函数,问题似乎解决。
    还好只在 SDI中更新视图。
    如果在MDI中,打开了多个View,我该如何找到特定的视图更新呢?
      

  5.   

    >CListView::OnTimer(nIDEvent)究竟干了些什么
    里面会调用KillTimer。
    所以如果nIDEvent是你自己的定时事件,就不要调用默认的处理过程。
      

  6.   

    是vc的问题, 在Ininstance中有一句话(假设是单文档)
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CYourDoc),
    RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
    RUNTIME_CLASS(CYourView));mfc将他们放在一个模板里面了, 一般这3个类在frame里用ontimer
    如果想要在view类里写响应函数的话,可以用这种方法得到view类指针
    CMainFrame::OnTimer(nIDEvent)
    {
        CYourView* pView = (CYourView*)GetActiveView();
        pView->yourFunction();
    }
    顺便说一下,nIDEvent 就是SetTimer(1,1000, NULL);中的第一个参数.