MFC 定时器一次性执行

Posted

技术标签:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

【参考方案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 工作之前执行几次......

以上是关于MFC 定时器一次性执行的主要内容,如果未能解决你的问题,请参考以下文章

mfc 线程里设置定时器settimer,但是执行不道OnTimer里

在一个 MFC 应用程序中,如何使用两个定时器?

vcmfc定时器

MFC如何在对话框内加入计时器并实时显示出来?

求大神!!如何在MFC中设置一个计时器?

C#如何在BackgroundWorker 后台线程中使用定时器?