none
VC Timer 问题 RRS feed

  • 问题

  • 请教一下大家。

    我创建了一个属性表单 sheet1,然后再创建两个属性页分别为 page1和page2,我要在page1和page2中分别监听不同的事情,

    我使用了一个笨的方法就是在page1和page2中创建连个Timer, 但发现我使用page1监听事情是没有问题的,但选择page2时page1的Timer还在工作

    没有被Kill到,到我已经在page1的destroy中Kill了Timer 1, 还在OnInitDialog() page2中再Kill一次就是没有停下来,想请问一下大家有没有更好的办法

    或者只需要建一个Timer的方法也可以,希望大家帮助一下谢谢

    2010年4月29日 3:50

全部回复

  • 你确定在选择page2时KillTimer了page1中设置的定时器?


    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2010年4月29日 8:24
    版主
  • 我确定了啊~!

    我在page2 中OnInitDialog() Kill了啊~!

    我在仔细想想

    2010年4月30日 0:48
  • 你确定在选择page2时KillTimer了page1中设置的定时器?


    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料

    但我是要在page1 和 page2 分别多次SetTimer(1)、SetTimer(2)和KillTimer(1), KillTimer(2)问题为不为出在这里呢?
    2010年4月30日 1:02
  • 是不是两个page 切换的时候并没有Destroy,也没有调用OnInitDialog。而只是ShowWindow。跟一下这两个方法是否被调用到了。
    麻烦把正确答案设为解答。
    2010年4月30日 2:00
    版主
  • 是的我发现没有调用Destroy()的,这是我调试过发现了~!

    这要怎么样解决啊~!

    我想问一下是否可以直接在 page2中KillTimer(1),这样是否正确呢?

    2010年4月30日 2:54
  • page切换时应该是隐藏和显示指定窗口,你应该在WM_SHOWWINDOW这个消息里来KillTimer和SetTimer.

    这个消息可以参考http://msdn.microsoft.com/en-us/library/ms632645(VS.85).aspx


    0xBAADF00D
    2010年4月30日 17:29
    版主
  • 我尝试了,但是我单步的时候没有进入WM_SHOWWINDOW消息响应函数啊?很奇怪,能否在page1 中kill page2的timer呢,我尝试了一个方法

    //page1里面获取page2的指针
            CPropSheet *pSheet = (CPropSheet*)GetParent();
    if(pSheet!=NULL)
    {
    CMyPage2 *pPage = (CMyPage2*)pSheet->GetPage(1);
    if(pPage!=NULL)
    {
    pPage->StopTime();             //调用page2里面KillTimer方法
                                                           //但是来到这里报错了
    }
    }

    请大家帮忙一下,谢谢大家啊

    2010年5月1日 8:59
  • 问题重复一下:我的设计是这样的,在属性表单CPropSheet中添加连个属性页,分别为page1和page2,然后在page1和page2中创建两个Timer分别为 Timer1和Timer2,就是在切换属性页是,应该如果Kill到另一个Timer,例如:我切换到page2的时候page1的Timer没有被Kill,应该如果做才可以Kill到page1的Timer呢?
    我尝试了一种在page1获取page2的指针,或者在page2获取page1的指针,然后再调用KillTimer,但报错了实现如上
    2010年5月1日 9:11
  • 可以在其他的线程关掉Timer的,建议用API:KillTimer,他可以传递窗口句柄,用窗口句柄而不是MFC的窗口指针这样安全些。


    0xBAADF00D
    2010年5月1日 9:39
    版主
  • jkhuang23  您好,

    我仔细看了一下大家的讨论结果,发现有几个问题还是没搞清楚。从您的描述来看,您调用了CWD::KillTimer 方法kill计时器,但是并没有成功。现在的问题这个调用到底有没有执行。换句话来说,到底是执行发生错误导致没kill掉还是根本没调用。这个需要您进一步debug然后反馈给我们。

    根据我的理解,调用导致失败的可能性不大,最大的可能性还是没有调用成功。我的建议是找到一个属性页切换的事件或消息来完成kill这个事情,这样可以保证Timer被kill掉。我知道的一个方法是处理属性表单的TCN_SELCHANGE 消息来做这个事情。这个消息在切换属性页的时候触发。实际上,属性表单就是一个包含了CTabCtrl的对话框,所以我们可以用上面的方法来搞定这个问题。具体怎么做您可以参考下面的文档,里面用到了类似的方法。
    http://support.microsoft.com/kb/143291/zh-cn

    如果我的回复没能帮助到您,请及时回复。
    Aland Li


    Please mark the replies as answers if they help and unmark if they don't. This can be beneficial to other community members reading the thread.
    2010年5月5日 9:01
    版主