之前用的都是VB6,没用过.NET或者VB2010,不会用多线程,只是个VB初级入门
当doevents loop until 后面的条件一直不成立时,定时器timer在不停的做循环带来的假死;
但是让我不明白的地方是在VB6中一样的代码为何没有假死现象,到2010里头就有了?
请教高手该如何解决?以下是完整的源代码:
'定时器的间隔为200ms
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick         If Winsock1.CtlState <> MSWinsockLib.StateConstants.sckConnected Then
            Call initialize_Param()     
         Else
            ''执行其他任务
         End If
End SubPrivate Sub initialize_Param()   
  
  Winsock1.Close()
  Winsock1.Connect() 
  Do
      Application.DoEvents()
  Loop Until Winsock1.CtlState = MSWinsockLib.StateConstants.sckConnected ''如果连接成功则退出   End Sub

解决方案 »

  1.   

    与定时器无关,与你的程序结构有关,do...loop要删除(因为它根本没有必要存在),定时如下:Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    '关闭定时器
    ......
             If Winsock1.CtlState <> MSWinsockLib.StateConstants.sckConnected Then
                Call initialize_Param()     
             Else
                ''执行其他任务
             End If
    '打开定时器
    .......
    End Sub
      

  2.   

    有必要存在的啊
    因为在定时器设定的200ms内,winsock要通过doevents来暂挂程序,让winsock实现连接的
      

  3.   

    你需要在Timer1_Tick开始就把Timer1禁止掉,Timer1_Tick退出时再把Timer1开启
    否则在Do
          Application.DoEvents()
      Loop 就会不停地收到WM_TIMER,然后就不停地递归执行Timer1_Tick,这样当然会把Application.DoEvents()
    的大部分时间占掉,导致相应慢,最后还会把线程的保留栈空间用光