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 定时器一次性执行的主要内容,如果未能解决你的问题,请参考以下文章