有个问题请教大家。
我用vb做的个抓数据的小软件。
用了3个timer控件,分别抓3个网页的数据,实时性的要求比较高,所以timer控件的interval的时间设置的比较短,就因为这样,有时会在界面出现“没有响应”的提示,我本来想加个“doevents”函数,但只能加一个,请问有什么好办法可以解决这个问题的。
我用vb做的个抓数据的小软件。
用了3个timer控件,分别抓3个网页的数据,实时性的要求比较高,所以timer控件的interval的时间设置的比较短,就因为这样,有时会在界面出现“没有响应”的提示,我本来想加个“doevents”函数,但只能加一个,请问有什么好办法可以解决这个问题的。
为什么只能加一个?不是用了doevents,在它还没有返回前不能再用吗,要不会产生不可预料的错误,3个timer如果加3个doevents肯定会出现一个doevents还没有返回有用了另外一次的doenents的情况的啊。
private m_InProcess as booleanprivate sub TimerX_Timer()
if m_InProcess then exit sub
m_InProcess = True
正常的处理过程
m_InProcess = False
end sub
private m_InProcess as booleanprivate sub TimerX_Timer()
if m_InProcess then exit sub
m_InProcess = True
正常的处理过程
m_InProcess = False
end sub这种方法很不错,但是会不会有一个缺点,就是有可能出现一个timer或两个timer里面的事件长时间得不到处理。
谢谢Tiger_Zhao(VB老鸟),这个方法可以考虑,看看还有没有更好的方法。其实我对doenents还不是很了解。
他是不是要等系统中所有其他的事件处理完了在继续处理doevents后面的事件。
比如说我开了软件了,到的doevents了,这时候我用ie打开了两个很占资源的网站,它是不是要等到两个网站打开完了才处理doevents后面的事件呢。
他是不是要等系统中所有其他的事件处理完了在继续处理doevents后面的事件。
比如说我开了软件了,到的doevents了,这时候我用ie打开了两个很占资源的网站,它是不是要等到两个网站打开完了才处理doevents后面的事件呢。
的答案是什么啊?
实际上timer最好不要太多,否则确实可能会出现一些问题,对你来说,即使需要考虑实时性,也完全可以通过一个timer来实现
可以用3个tick标志来判断是否需要执行哪个任务,timer的Interval设置为三个任务interval相减的最小值
但是就是我每一个timer里面的事件的执行时间比较长,如果不并发执行的话,实时性就比较差了
您的回答这个地方我没弄懂:
timer的Interval设置为三个任务interval相减的最小值
Private Function Delay(MSceond As Long)
Dim i As Long
If MSceond < 2 Then Exit Function
i = GetTickCount
Do While GetTickCount - i < MSceond
DoEvents
Loop
End Functionprivate sub form_load()
delay(200) '200即为参数200毫秒
end sub调用api实现延迟200ms
看看这个函数对你有用没?
他是不是要等系统中所有其他的事件处理完了在继续处理doevents后面的事件。
比如说我开了软件了,到的doevents了,这时候我用ie打开了两个很占资源的网站,它是不是要等到两个网站打开完了才处理doevents后面的事件呢。
===================================================================
doevents只是相对本程序而言的
而不是针对整个系统吧,看下面这段MSDN上的话:
如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。
这样的话估计用我那个延时的代码倒可以
反正doevents不能放在直接采集数据的过程里面吧
doevents我的理解就是会让程序的其他部分得到一点儿执行时间,而不是完全被占资源的代码给用掉,而其他代码执行完后不能显示效果
datou985说的对,doevents应该是针对本进程而言
如果你单个任务的执行时间较长,我说的方法显然不适用,还是开多个timer吧,注意一个timer的使用要点,如下
sub timer1_timer()
timer1.enable=false
'''''''''''''''''''
do your job
'''''''''''''''''''
timer1.enable=true
end sub
这样能够有效防止timer事件溢出
实际上,近期我的一个软件就有类似你的构架,3个timer,interval都是1000
其中一个任务的平均处理时间在12到20秒,一个是百毫秒级,另一个最多甚至是数百秒。这个软件最长的运行时间是将近100个小时,也没有什么问题。
我对timer的处理和您的方式是一样的。
但是这样的话不会出现这种情况吗,就是程序在运行的过程中,你点其中的某个command控件,有时候由于系统正在忙于处理timer中的事件,而出现没有响应的提示。
我用Tiger_Zhao(VB老鸟) 的方法改进了一下,在测试一段时间看看效果。
Dim sTime As Long
Dim sNow As Long
sTime = timeGetTime
Do While (sNow - sTime) <= t
sNow = timeGetTime
If StopFlag Then Exit Do
If t = 100 Then Debug.Print t & "ms"
If t = 10 Then Debug.Print t & "ms"
DoEvents '解决界面假死
Sleep 1 '降低CPU使用率
Loop
End Sub
这样后,导致关闭Form操作后,Form又重新被Load,窗体虽然没被显示,但其中的程序一直在运行,这个怎么解决啊?
如果你单个任务的执行时间较长,我说的方法显然不适用,还是开多个timer吧,注意一个timer的使用要点,如下
sub timer1_timer()
timer1.enable=false
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
do your job
'……
[/Quote]