哪里出问题了?为什么一句句运行可以,一起运行就有点问题?另外可否设置按钮退出死循环?
哪里出问题了?为什么一句句运行可以,一起运行就有点问题?
Private Sub Command3_Click()
Call doloop
End Sub
Public Sub doloop()
Call collect
iRecord = i
Do While True
Sleep 1000
Call collect
iagain = i
If iagain = iRecord Then
ledDI(iagain).Value = 1 '为1时灯亮(第三方控件)
ledDO(iagain).Value = 1 '同上
Timer1.Enabled = True
Exit Do
Else
iRecord = iagain
End If
Loop
End Sub
Public Sub collect()
i = 0
Do Until ZT8403_DIBit(m_cardNO, i + 1) = 1
i = i + 1
If i = m_chCount Then i = 0
Loop
End Sub
Private Sub Timer1_Timer()
If ZT8403_DIBit(m_cardNO, iagain + 1) = 0 Then
ledDI(iagain).Value = 0 '灯灭,一句句运行可以实现,但一起运行灯 _
ledDO(iagain).Value = 0 '要等到下一信号进来灯才灭,换一灯亮.
Timer1.Enabled = False
Call doloop
End If
End Sub
因为程序一直处于循环状态,退出程序比较困难,有没有什么办法解决?能否设置一按钮退出循环?谢谢!
[解决办法]
首先要解决在循环中能响应你点击BUTTON 的问题//你可以在循环中增加释放资源的语句DOEVENTS,这样当执行这个语句的时候就能让出一点时间让系统响应其他消息,比如你的中断消息
其次,你要在循环中增加一个判断,如果是假就继续循环,如果是真就BREAK,跳出循环
这个判断是真是假就由你的CLICK按钮来设置,就这样,代码自己写吧
[解决办法]
在循环里设置一个停止标记。
dim bStop as boolean
bstop=false
Do While True
if bstop then exit do
doevents
loop
Private Sub Command4_Click()
bstop=not bstop
End Sub
[解决办法]
设置DOEVENTS,并用一个变量检测是否应该退出,这个变量在BUTTON CLICK中可以被改变.
这是一种解决办法, 实际上完全看你的需求到底怎样, 比如, DOEVENT 会在你程序执行中引导CPU做其他事情, 而且降低速度, 这个对你的设计是否有影响?
防止影响太大的一个方法是, 在一个循环中, 增加一层for next循环, 在这个循环出来时执行DOEVENTS, 这样就可以大大减少对速度的影响. 或用TIMER来控制时间, 每秒钟执行一次DOEVENTS, 也是一种常用的办法.
[解决办法]
在死循环里加上DoEvent语句
------解决方案--------------------
Private Sub Command3_Click()
bStop = False
Call doloop
End Sub
Private Sub Command4_Click()
bStop = True
End Sub
Public Sub doloop()
Call collect
iRecord = i
Do While True
DoEvents
If bStop Then Exit Do
Sleep 1000
Call collect
iagain = i
If iagain = iRecord Then
ledDI(iagain).Value = 1 '为1时灯亮(第三方控件)
ledDO(iagain).Value = 1 '同上
Timer1.Enabled = True
Exit Do
Else
iRecord = iagain
End If
Loop
End Sub
Private Sub Timer1_Timer()
If ZT8403_DIBit(m_cardNO, iagain + 1) = 0 Then
ledDI(iagain).Value = 0 '灯灭,一句句运行可以实现,但一起运行灯 _
ledDO(iagain).Value = 0 '要等到下一信号进来灯才灭,换一灯亮.
Timer1.Enabled = False
DoEvents
Call doloop
End If
End Sub