大家好,我最近使用Vb,遇到问题如下:环境:Winxp professional中文版,VB6中文版问题描述如下:我做了个程序,不断循环的建立socket连接到某服务器端口,得到数据,关闭链接,进入下次循环。
我在循环过程中设置了timer,enabled=true,Interval=1000(为了方便测试,所以设置很小),timer事件中判断这个socket连接过程是不是“卡死”(设置了一个全局变量,检查这个变量),如果“卡死”就重新调用这个循环。我发现只有第一次“卡死”的时候,这个timer事件能够触发,然后使循环继续下去,以后再怎么卡都不能触发timer事件了。卡死就是一次循环的运行时间超过Interval设置的事件的意思。循环代码基本如下:Function Command1_click'防止突发
Winsock1.CloseFor i =....Timer2.Interval = 1000
Timer2.Enabled = Truesssss = chkServer(sArr(i))‘此函数用来建立socket链接,去取数据While Winsock1.State <> 8 And Winsock1.State <> 9 And Winsock1.State <> 0
DoEvents
Wend其他处理NEXTEnd FunctionPrivate Sub Timer2_Timer()
MsgBox ("进入 timer2")
If 卡死 Then
   Timer2.Enabled = False
   Command1_Click ’重新调用click事件开始新的循环
End If
Timer2.Enabled = False
End Sub现在怎么搞都只显示一次"进入 timer2"
希望大家能指教一下。万分谢谢

解决方案 »

  1.   

    If 卡死 Then 
      Timer2.Enabled = False 
      Command1_Click ’重新调用click事件开始新的循环    '这个怎么也要在停止TIMER2之前吧
    End If 
    Timer2.Enabled = False ?? 你执行一次后就永远UP掉了
      

  2.   

    你没有把"卡死"这个全局变量在处理完完卡死后改回去啊.

    Private Sub Timer2_Timer() 
    MsgBox ("进入 timer2") 
    If 卡死 Then 
      Timer2.Enabled = False 
      [color=#00FF00]"卡死"="不卡"

      Command1_Click ’重新调用click事件开始新的循环 
    End If 
    Timer2.Enabled = False 
    End Sub 
    [/color]
      

  3.   

    禀告楼上的岛主,我每次循环都设置enable=true的。
    还有就是1.
    If 卡死 Then 
      Timer2.Enabled = False 
      Command1_Click ’重新调用click事件开始新的循环    '这个怎么也要在停止TIMER2之前吧 
    End If 
    command1_click 写到enabled前面也照旧的。2.
    Timer2.Enabled = False ?? 你执行一次后就永远UP掉了 
    没有这句话也照旧
      

  4.   


    Private Sub Timer2_Timer() 
    MsgBox ("进入 timer2") 
    If 卡死 Then 
      Timer2.Enabled = False
     
      "卡死"="不卡"
    Command1_Click ’重新调用click事件开始新的循环 
    End If 
    Timer2.Enabled = False End Sub 
      

  5.   


    我的意思是说不管卡不卡死,那个MsgBox ("进入 timer2") ,都要运行多次吧。我这里就1次。就再也不进这个事件了我想没interval都进这个事件检测的。
      

  6.   

    这里面存在timer嵌套自己的问题啊,你在timer里循环,在timer里触发自己,不知道timer能不能嵌套自己执行啊!
      

  7.   

    Private Sub Timer2_Timer() 
    MsgBox ("进入 timer2") 
    If 卡死 Then 
      Timer2.Enabled = False 
      Command1_Click ’重新调用click事件开始新的循环 
    End If 
    Timer2.Enabled = False 
    End Sub 
     
    Command1_Click 的调用位置有问题,
    一直在Timer2_Timer中还没出去
      

  8.   

    程序卡死了,Timre2 也就停了,当然也就不会调用command1_click了,Timer控件并不一直运行,如弹出一个Msgbox,它就停下来了,何况程序都卡死了.
      

  9.   

    Dim flag As BooleanPrivate Sub SSS()
        flag = False
        '防止突发
        Winsock1.Close
        
        For i =....
        
            Timer2.Interval = 1000
            Timer2.Enabled = True
            sssss = chkServer(sArr(i))‘此函数用来建立socket链接,去取数据
            While Winsock1.State <> 8 And Winsock1.State <> 9 And Winsock1.State <> 0
                DoEvents
                If flag Then
                    Exit Sub
                End If
            Wend
            其他处理
        Next
    End Sub
    Function Command1_click()
        Do
            Call SSS
        Loop While flag
    End FunctionPrivate Sub Timer2_Timer()
        MsgBox ("进入 timer2")
        If 卡死 Then
            Timer2.Enabled = False
            flag = True
        End If
        Timer2.Enabled = False
    End Sub
      

  10.   


    Function Command1_click 
    StartLine:
    卡死=不卡

    '防止突发 
    Winsock1.Close For i =.... 
    If 卡死 Goto StartLine:
    Timer2.Interval = 1000 
    Timer2.Enabled = True sssss = chkServer(sArr(i))‘此函数用来建立socket链接,去取数据 While Winsock1.State <> 8 And Winsock1.State <> 9 And Winsock1.State <> 0 
    DoEvents 
    Wend 其他处理 NEXT End FunctionPrivate Sub Timer2_Timer() 
    MsgBox ("进入 timer2") 
    卡死=卡死
    Timer2.Enabled = False 
    End Sub
      

  11.   

    Function Command1_click()
    应该是
    private Sub Command1_click()在for循环没结束的时候,重新从Doevents这里进入Command1_click
    后果应该不可预料
    改了一下,应该可以了
      

  12.   

    Function Command1_click 
    StartLine:
    卡死=不卡

    '防止突发 
    Winsock1.Close For i =.... 
    If 卡死 Goto StartLine:
    Timer2.Interval = 1000 
    Timer2.Enabled = True sssss = chkServer(sArr(i))‘此函数用来建立socket链接,去取数据 While Winsock1.State <> 8 And Winsock1.State <> 9 And Winsock1.State <> 0 
    DoEvents 
    Wend 其他处理 NEXT End FunctionPrivate Sub Timer2_Timer() 
    MsgBox ("进入 timer2") 
    卡死=卡死
    Timer2.Enabled = False 
    End Sub
      

  13.   


    Function Command1_click '防止突发 
    Winsock1.Close For i =.... 
    flag=0
    Timer2.Interval = 1000 
    Timer2.Enabled = True sssss = chkServer(sArr(i))‘此函数用来建立socket链接,去取数据 While Winsock1.State <> 8 And Winsock1.State <> 9 And Winsock1.State <> 0 
    DoEvents 
    Wend 其他处理 NEXT End Function Private Sub Timer2_Timer() 
    MsgBox ("进入 timer2") 
    If 卡死 Then 
      Timer2.Enabled = False 
      flag=1 End If 
    Timer2.Enabled = False 
    End Sub Private Sub Timer3_Timer() 
    MsgBox ("进入 timer3") 
    If flag=1 Then 
      
      Command1_Click ’重新调用click事件开始新的循环 
    End If 
    End Sub
      

  14.   

    To sulipeng 007 :卡死不卡死不是问题的重点。那个没任何影响的。
      

  15.   

    反正我的观点是没事别在TIMER里 写 MSGBOX 
      

  16.   

    还有尽量记得写个 ON ERROR RESUME NEXT
      

  17.   

    yachong这个不能一直运行下去吧?要有人点command?这个click事件没触发?循环一旦中止一次就不能继续了吧?还有就是msgbox在timer里是为了调试。
      

  18.   

    看不懂你在说什么
    要有人点command?
    Command当然要有人点
    这个click事件没触发?
    什么意思?
    循环一旦中止一次就不能继续了吧?
    哪个循环?试验过我的代码了吗?
      

  19.   

    yachong,我这个程序是要循环不停的运行,我的意思是说当flag = True,以后,会退出sub sss,对吧?你的意思时说,当flag= true以后,command_click里面会自动call sss?
      

  20.   

    我的command就第一次运行的时候点一次,然后再也不用管了。遇到卡死就会重新call command_click事件。