VB6轮询与定时器事件

VB6 polling vs timer event

我的应用程序的每个外部进程都轮询一个布尔值以查看是否有工作要做。我现在想在 Timer 事件中检查该变量以减少 'not responding' 消息。

Timer 对象必须放在窗体上,这似乎会造成一些限制。

从带有 Me.Show (vbModal) 的表单启动事件效果很好。只是我不想实际显示该表格,我只想使用计时器。尝试使用 Me.Hide 隐藏表单然后丢失我需要的模态行为,因此这不是一个好的解决方法。

我尝试从 class 启动事件,但它表现出与 Me.Hide 相同的不良行为:处理 returns 给调用者而不是停留在计时器事件子等待中为了工作。

有什么方法可以实现基于 Timer 的事件,它不需要显示表单并且不会立即 return 给调用者? 外部进程没有屏幕 IO,需要 none。

您可以研究使用 Windows API 中的 SetTimer 函数。在模块和用户 TimerStart 中添加以下代码,间隔以毫秒为单位:

Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Public Function TimerStart(ByVal p_lngInterval As Long) As Long
    
    ' Start timer
    TimerStart = SetTimer(0, 0, p_lngInterval, AddressOf TimerCallBack)

End Function

Public Sub TimerCallBack(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    
    ' Handle your polling here

End Sub

您不需要表格,所以这应该符合您的需要。

您还可以将 Windows API 中的 Sleep 与计时器结合使用,以保持您的 EXE 运行:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Sub Main()

    TimerStart 2000
    
    Do While True
        DoEvents
        Sleep 1000
    Loop
    
End Sub

有关详细信息,请参阅这些其他答案:

  • How to make safe API Timers in VBA?
  • How do I delay code execution in Visual Basic (VB6)?