MFC OnTimer 从其他地方接收额外事件

Posted

技术标签:

【中文标题】MFC OnTimer 从其他地方接收额外事件【英文标题】:MFC OnTimer receiving extra events from somewhere else 【发布时间】:2014-11-05 22:49:46 【问题描述】:

我有一个使用 ON_WM_TIMER 的 MFC 应用程序。

前 1-2 分钟,我用

启动计时器
m_nIDEvent = SetTimer( 234, 500, NULL );

这是完美的工作,但在运行应用程序 2-3 分钟后,我收到另一个事件,我不知道它来自哪里,每 100 毫秒左右。

所以,我有 无效 SomeClass::OnTimer(UINT 事件) 字符 str[100]; sprintf_s(str, "事件 = %d\n", 事件);

起初它只打印出事件#234,但在2-3分钟后它开始显示430-432的一些事件。有什么想法吗?

我尝试在 afxwin2.inl (其中定义了 SetTimer )处设置断点,并且在事件中我按预期将其停在那里,而不是其他随机事件。

有什么想法吗?

谢谢!

【问题讨论】:

旧浏览器不允许我编辑它,但我没有添加 OnTimer 上的打印语句。 Windows 内部使用计时器来实现某些视觉效果。您能否更具体地说明您所指的“SomeClass”? 是的,对不起。我有一个名为 Viewer2 的类,它是 CRichEditView 的基类。现在我保持简单,只使用 WM_TIMER 向 CRichEditView 添加一些文本。 【参考方案1】:

这是 Windows 计时器的本质。所有计时器事件都由单个消息 WM_TIMER 处理,您的 OnTimer 函数应该检查它可以处理的特定事件。一些 Windows 组件可以生成自己的计时器请求,而这些请求不会通过 MFC 的 SetTimer 函数来触发您的断点。

【讨论】:

我刚刚注意到这一点,例如我从代码中删除了 SetTimer 事件。当我左键单击并拖动 RichEditView 窗口时,此问题是可重复的,我猜这将是 MFC 的预期响应,问题是它卡住并继续调用它,即使我没有使用左键单击/拖动.

以上是关于MFC OnTimer 从其他地方接收额外事件的主要内容,如果未能解决你的问题,请参考以下文章

mfc 时钟 OnTimer 非静态成员函数的非法调用

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

MFC显示系统时间

MFC的定时器OnTimer

2创建MFC应用程序——基于对话框,时间计时器

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