mfc 线程里设置定时器settimer,但是执行不道OnTimer里
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mfc 线程里设置定时器settimer,但是执行不道OnTimer里相关的知识,希望对你有一定的参考价值。
参考技术A 您好,这样的:因为,在调用构造函数时对话框还没有初始化,此时的SetTimer对对话框无效,
只有在对话框进行初始化时才能设定其定时器,
或者在对话框初始化后SetTimer()也行。
不要在构造函数中SetTimer,你如果一定要自动执行的化可以在OnInitDialog或OnShowWindow下面做。
还有就是100毫秒这个参数会使OnTimer下的程序在1秒种执行10次,你在里面放一个MessageBox是不是太。
另外,如果你要试一下它到底有没有执行的话,可以把SetTimer的参数设大一点,比如2000
然后用AfxMessageBox
不可你要做好快速反应结束程序的准备,要不然会有。
MFC 定时器一次性执行
【中文标题】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 线程里设置定时器settimer,但是执行不道OnTimer里的主要内容,如果未能解决你的问题,请参考以下文章