【问题标题】:MFC Timer One-time ExecuteMFC 定时器一次性执行
【发布时间】:2013-05-11 21:25:35
【问题描述】:

我正在使用 MFC 用 C++ 编程。

我想在 UI 完全加载后执行一段代码,所以我把它放在一个 OnTimer 回调中,并在 OnInitDialog 中调用 SetTimer。问题是如何让那个定时器只执行一次?

任何帮助将不胜感激。

【问题讨论】:

    标签: visual-c++ mfc timer


    【解决方案1】:

    你必须使用 KillTimer 功能,但你需要小心只执行一次计时器。 例如,您编写如下代码,

    #define TID_ONLY_ONCE WM_USER + 202
    void CSampleDlg::OnTimer(UINT_PTR nIDEvent)
    {
        if(nIDEvent == TID_ONLY_ONCE)
        {
            KillTimer(TID_ONLY_ONCE);
            SomethingLongProcess(pSomeData);
        }
        CDialog::OnTimer(nIDEvent);
    }
    

    如果你设置timer elapse很快,虽然你调用了KillTimer,'ontimer()'会被执行几次,因为SomethingLongProcess需要很长时间。 所以,为了避免这种情况,

    • 在调用 SetTimer() 后立即调用 KillTimer()。
    • 或使用全局布尔成员。调用 SetTimer 后,将全局成员设置为 true,然后在 OnTimer() 中检查该值是否会执行SomethingLongProcess()。

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      除了使用计时器,您还可以使用 PostMessage 向自己发布消息,这将使待处理的窗口消息队列得到处理。然后你可以在 PostMessage 处理程序中做你想做的事。这样您就不必担心杀死计时器。 (见http://msdn.microsoft.com/en-us/library/9tdesxec%28v=vs.80%29.aspx

      【讨论】:

        【解决方案3】:

        第一次调用定时器函数调用 KillTimer。

        【讨论】:

        • 我试过了,但是计时器仍然会在 kill timer 工作之前执行几次......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多