有个问题请教大家。
我用vb做的个抓数据的小软件。
用了3个timer控件,分别抓3个网页的数据,实时性的要求比较高,所以timer控件的interval的时间设置的比较短,就因为这样,有时会在界面出现“没有响应”的提示,我本来想加个“doevents”函数,但只能加一个,请问有什么好办法可以解决这个问题的。

解决方案 »

  1.   

    chewinggum(口香糖·第二次减肥计划执行中) ( ) 信誉:105  2007-9-18 19:14:01  得分: 0  
       
    为什么只能加一个?不是用了doevents,在它还没有返回前不能再用吗,要不会产生不可预料的错误,3个timer如果加3个doevents肯定会出现一个doevents还没有返回有用了另外一次的doenents的情况的啊。  
     
      

  2.   

    用一个 Boolean 型的模块变量,所有的 Timer 事件都如下处理:
    private m_InProcess as booleanprivate sub TimerX_Timer()
      if m_InProcess then exit sub
      m_InProcess = True
      正常的处理过程
      m_InProcess = False
    end sub
      

  3.   

    用一个 Boolean 型的模块变量,所有的 Timer 事件都如下处理:
    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后面的事件呢。
      

  4.   

    既然三个网页不能同时抓,为什么不在一个 Timer 中顺次执行?
      

  5.   

    既然三个网页不能同时抓,为什么不在一个 Timer 中顺次执行?还是考虑到实时性的问题,才没有那么做啊。其实我对doenents还不是很了解。
    他是不是要等系统中所有其他的事件处理完了在继续处理doevents后面的事件。
    比如说我开了软件了,到的doevents了,这时候我用ie打开了两个很占资源的网站,它是不是要等到两个网站打开完了才处理doevents后面的事件呢。
    的答案是什么啊?
      

  6.   

    doevents并非你想象的那样,它虽然是分一些时间片给其它进程,但并不会造成你说的那样的现象。
    实际上timer最好不要太多,否则确实可能会出现一些问题,对你来说,即使需要考虑实时性,也完全可以通过一个timer来实现
    可以用3个tick标志来判断是否需要执行哪个任务,timer的Interval设置为三个任务interval相减的最小值
      

  7.   

    谢谢subzero(赘姆烂壳)的回答,也是个很好的方案。
    但是就是我每一个timer里面的事件的执行时间比较长,如果不并发执行的话,实时性就比较差了
    您的回答这个地方我没弄懂:
    timer的Interval设置为三个任务interval相减的最小值
      

  8.   

    Private Declare Function GetTickCount Lib "kernel32" () As Long         '调用api实现延迟200ms
    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
    看看这个函数对你有用没?
      

  9.   

    其实我对doenents还不是很了解。
    他是不是要等系统中所有其他的事件处理完了在继续处理doevents后面的事件。
    比如说我开了软件了,到的doevents了,这时候我用ie打开了两个很占资源的网站,它是不是要等到两个网站打开完了才处理doevents后面的事件呢。
    ===================================================================
    doevents只是相对本程序而言的
    而不是针对整个系统吧,看下面这段MSDN上的话:
        如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。
    这样的话估计用我那个延时的代码倒可以
    反正doevents不能放在直接采集数据的过程里面吧
    doevents我的理解就是会让程序的其他部分得到一点儿执行时间,而不是完全被占资源的代码给用掉,而其他代码执行完后不能显示效果
      

  10.   

    我的说法有误,抱歉
    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个小时,也没有什么问题。
      

  11.   

    谢谢datou985(^\会急转弯儿的猪/^)的热情帮助,延迟可能不大合适,因为我无法确定我什么时候需要延迟,您对doevents的回答,让我真正理解了这个函数。subzero(赘姆烂壳)
    我对timer的处理和您的方式是一样的。
    但是这样的话不会出现这种情况吗,就是程序在运行的过程中,你点其中的某个command控件,有时候由于系统正在忙于处理timer中的事件,而出现没有响应的提示。
      

  12.   

    谢谢大家了!
    我用Tiger_Zhao(VB老鸟) 的方法改进了一下,在测试一段时间看看效果。
      

  13.   

    您好,我是按您的思路写的程序,我的一个Timer中执行了一个时间较长的任务,其中还有延时,延时函数中用了DoEvents,Public Sub Delay(t As Long)
        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]