之前用的都是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
当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
'关闭定时器
......
If Winsock1.CtlState <> MSWinsockLib.StateConstants.sckConnected Then
Call initialize_Param()
Else
''执行其他任务
End If
'打开定时器
.......
End Sub
因为在定时器设定的200ms内,winsock要通过doevents来暂挂程序,让winsock实现连接的
否则在Do
Application.DoEvents()
Loop 就会不停地收到WM_TIMER,然后就不停地递归执行Timer1_Tick,这样当然会把Application.DoEvents()
的大部分时间占掉,导致相应慢,最后还会把线程的保留栈空间用光