我的应用程序的外部进程每个都轮询一个布尔值,看看是否有工作要做。我现在想在Timer
事件中检查该变量,以减少"未响应"消息。
Timer对象必须放置在窗体上,这似乎会造成一些限制。
从具有Me.Show
(vbModal
(的表单启动活动非常有效。只是我不想实际显示那个表格,我只想使用计时器。尝试使用Me.Hide
隐藏表单会丢失我需要的模态行为,所以这不是一个好的解决方法。
我尝试从类中启动事件,但它表现出与Me.Hide
相同的不需要的行为:处理返回给调用者,而不是停留在计时器事件子中等待工作。
是否有任何方法可以实现基于Timer
的事件,该事件不需要显示表单,也不会立即返回给调用者外部进程没有屏幕IO,也不需要。
您可以从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的睡眠与定时器一起保持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
有关更多详细信息,请参阅以下其他答案:
- 如何在VBA中制作安全的API计时器
- 如何延迟Visual Basic(VB6(中的代码执行