VB6定时器问题

VB6定时器问题,vb6,timer,Vb6,Timer,我有一个旧的VB6应用程序存在计时器问题。有一个模态形式包含一些元素和两个计时器(VB6标准计时器)。每个计时器的工作原理如下(伪代码): 然后,在某个时间点,OCX控件引发一个事件,表示某些连接丢失。Is与计时器本身无关。但是在这一点上,计时器事件不再为两个计时器引发,尽管现在奇怪的是,计时器被启用,并且设置了2000的间隔。即使重新启用和重新设置间隔也没有任何效果。当来自同一OCX控件的另一个事件引发连接已恢复时,计时器事件会突然再次引发。 即使删除OCX控件事件处理程序中的所有代码,计时器

我有一个旧的VB6应用程序存在计时器问题。有一个模态形式包含一些元素和两个计时器(VB6标准计时器)。每个计时器的工作原理如下(伪代码):

然后,在某个时间点,OCX控件引发一个事件,表示某些连接丢失。Is与计时器本身无关。但是在这一点上,计时器事件不再为两个计时器引发,尽管现在奇怪的是,计时器被启用,并且设置了2000的间隔。即使重新启用和重新设置间隔也没有任何效果。当来自同一OCX控件的另一个事件引发连接已恢复时,计时器事件会突然再次引发。 即使删除OCX控件事件处理程序中的所有代码,计时器也无法工作

我不太熟悉DoEvents的“模式”,但我认为这个问题一定与DoEvents有关。移除这个并没有改变任何事情

有人知道这里会发生什么吗?我已经找到了任何全局设置,可以阻止计时器引发已过去的事件,但看在上帝的份上,我找不到任何全局设置

我快疯了


谢谢您的帮助。

很抱歉回复太晚

这是另一个计时器的计时问题。另一个计时器ping另一个IP,ping超时为200ms。该定时器间隔为200ms。因此,如果ping超时(因为另一台机器已断开连接),计时器的触发频率将超过其可处理的频率。因此,它扰乱了事件队列并阻止所有其他计时器触发。 通过将计时器间隔增加到1000毫秒,它可以工作,尽管更好的解决方案是停止计时器,处理事件,然后重新启动计时器


谢谢你的帮助提示

我很怀疑你引用的代码中有问题。相反,我怀疑OCX控件是用C/C++编写的,直接干扰了应用程序的消息泵,导致计时器中断。虽然已经有一段时间了,但DoEvents基本上是用于在长时间阻塞主线程时清空事件队列。我不确定它的确切效果——我知道在某些情况下,连续多次给DoEvents打电话是必要的。它的主要用途是在执行长时间运行的处理时,不断绘制UI并响应用户输入。我不知道你为什么要在事件处理程序的末尾调用它,但我认为它实际上不会有任何影响。你的问题可能是OCX调用某个地方的
GetMessage()
并使用计时器事件。我怀疑,但不确定,VB6定时器只是在下面使用WM_定时器。也许OCX,听上去是一个网络库,在内部使用WM_定时器超时,并且错误地将VB6定时器的消息解释为它自己的超时消息。我接触VB6已经有一段时间了,但通常你不会单独使用VB陷入如此混乱的境地——它几乎总是一个外部C库。祝你好运计时器确实在封面下使用WM_计时器,我想这些消息可能会被消耗掉。调用DoEvents获取并分派当前线程的windows消息队列中的所有消息,直到该队列为空。应该避免这种情况,因为它可能导致重新进入问题。
-- TimerEvent Start 
DoSomething
DoEvents
-- TimerEvent End