0

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

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

任何帮助,将不胜感激。

4

3 回答 3

2

您必须使用 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()。

我希望这会对你有所帮助。

于 2013-05-12T01:09:14.227 回答
1

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

于 2013-05-13T03:06:45.363 回答
-1

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

于 2013-05-12T00:13:32.300 回答