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里的主要内容,如果未能解决你的问题,请参考以下文章

vcmfc定时器

MFC 单个SetTimer怎么用啊

猎豹MFC--进度条CProgressCtrl 定时器SetTimer

MFC里SetTimer怎么使用

MFC:如何从不同的线程绘制opengl?

猎豹MFC--定时器SetTimer KillTimer