Timer控件只有第一次执行的时候有效出发Timer事件,怎么回事?

littleyy 2008-09-08 12:24:16
大家好,我最近使用Vb,遇到问题如下:

环境:Winxp professional中文版,VB6中文版

问题描述如下:

我做了个程序,不断循环的建立socket连接到某服务器端口,得到数据,关闭链接,进入下次循环。
我在循环过程中设置了timer,enabled=true,Interval=1000(为了方便测试,所以设置很小),timer事件中判断这个socket连接过程是不是“卡死”(设置了一个全局变量,检查这个变量),如果“卡死”就重新调用这个循环。

我发现只有第一次“卡死”的时候,这个timer事件能够触发,然后使循环继续下去,以后再怎么卡都不能触发timer事件了。

卡死就是一次循环的运行时间超过Interval设置的事件的意思。

循环代码基本如下:

Function Command1_click

'防止突发
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
Wend

其他处理

NEXT

End Function

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

现在怎么搞都只显示一次"进入 timer2"
希望大家能指教一下。

万分谢谢
...全文
480 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
bob008 2008-09-10
  • 打赏
  • 举报
回复
你把这句废掉看看
bob008 2008-09-10
  • 打赏
  • 举报
回复
又见DoEvents
littleyy 2008-09-09
  • 打赏
  • 举报
回复
我的command就第一次运行的时候点一次,然后再也不用管了。遇到卡死就会重新call command_click事件。
littleyy 2008-09-09
  • 打赏
  • 举报
回复
yachong,我这个程序是要循环不停的运行,我的意思是说当flag = True,以后,会退出sub sss,对吧?

你的意思时说,当flag= true以后,command_click里面会自动call sss?
yachong 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 littleyy 的回复:]
yachong这个不能一直运行下去吧?要有人点command?这个click事件没触发?循环一旦中止一次就不能继续了吧?

还有就是msgbox在timer里是为了调试。
[/Quote]
看不懂你在说什么
要有人点command?
Command当然要有人点
这个click事件没触发?
什么意思?
循环一旦中止一次就不能继续了吧?
哪个循环?

试验过我的代码了吗?
littleyy 2008-09-09
  • 打赏
  • 举报
回复
yachong这个不能一直运行下去吧?要有人点command?这个click事件没触发?循环一旦中止一次就不能继续了吧?

还有就是msgbox在timer里是为了调试。
yachong 2008-09-08
  • 打赏
  • 举报
回复
Dim flag As Boolean

Private 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 Function

Private Sub Timer2_Timer()
MsgBox ("进入 timer2")
If 卡死 Then
Timer2.Enabled = False
flag = True
End If
Timer2.Enabled = False
End Sub
SYSSZ 2008-09-08
  • 打赏
  • 举报
回复
程序卡死了,Timre2 也就停了,当然也就不会调用command1_click了,Timer控件并不一直运行,如弹出一个Msgbox,它就停下来了,何况程序都卡死了.
littleyy 2008-09-08
  • 打赏
  • 举报
回复
楼上两位的意思我好像明白一点了。那我应该如何处理呢?貌似是这个问题。
jhone99 2008-09-08
  • 打赏
  • 举报
回复
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中还没出去
打死不掉牙 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 littleyy 的回复:]
禀告楼上的岛主,我每次循环都设置enable=true的。
还有就是

1.
If 卡死 Then
Timer2.Enabled = False
Command1_Click ’重新调用click事件开始新的循环 '这个怎么也要在停止TIMER2之前吧
End If
command1_click 写到enabled前面也照旧的。

2.
Timer2.Enabled = False ?? 你执行一次后就永远UP掉了
没有这句话也照旧。。。
[/Quote]
这里面存在timer嵌套自己的问题啊,你在timer里循环,在timer里触发自己,不知道timer能不能嵌套自己执行啊!
littleyy 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sulipeng007 的回复:]
你没有把"卡死"这个全局变量在处理完完卡死后改回去啊.

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

[/Quote]

我的意思是说不管卡不卡死,那个MsgBox ("进入 timer2") ,都要运行多次吧。我这里就1次。就再也不进这个事件了。。。我想没interval都进这个事件检测的。
打死不掉牙 2008-09-08
  • 打赏
  • 举报
回复

Private Sub Timer2_Timer()
MsgBox ("进入 timer2")
If 卡死 Then
Timer2.Enabled = False

"卡死"="不卡"
Command1_Click ’重新调用click事件开始新的循环
End If
Timer2.Enabled = False End Sub
littleyy 2008-09-08
  • 打赏
  • 举报
回复
禀告楼上的岛主,我每次循环都设置enable=true的。
还有就是

1.
If 卡死 Then
Timer2.Enabled = False
Command1_Click ’重新调用click事件开始新的循环 '这个怎么也要在停止TIMER2之前吧
End If
command1_click 写到enabled前面也照旧的。

2.
Timer2.Enabled = False ?? 你执行一次后就永远UP掉了
没有这句话也照旧。。。
打死不掉牙 2008-09-08
  • 打赏
  • 举报
回复
你没有把"卡死"这个全局变量在处理完完卡死后改回去啊.

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

Command1_Click ’重新调用click事件开始新的循环
End If
Timer2.Enabled = False
End Sub
[/color]
bob008 2008-09-08
  • 打赏
  • 举报
回复
如果 洪荒大劫已至
门人不得出岛--岛已封
按纽出岛捣乱的事情就看着办吧---反正岛也封了

门人不得出岛--岛已封
bob008 2008-09-08
  • 打赏
  • 举报
回复
If 卡死 Then
Timer2.Enabled = False
Command1_Click ’重新调用click事件开始新的循环 '这个怎么也要在停止TIMER2之前吧
End If
Timer2.Enabled = False ?? 你执行一次后就永远UP掉了

bob008 2008-09-08
  • 打赏
  • 举报
回复
还有尽量记得写个 ON ERROR RESUME NEXT
bob008 2008-09-08
  • 打赏
  • 举报
回复
反正我的观点是没事别在TIMER里 写 MSGBOX

jhone99 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yachong 的回复:]
VB codeDim flag As Boolean

Private 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

[/Quote]

不错
加载更多回复(7)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧