VB 做流程控制的疑惑?
现在用VB做一个小小的项目,遇到问题,望好心人,指点迷津!
描述如下:系统界面上有两个按钮,一个启动按钮,一个停止按钮。
用户按下启动按钮后,进入 Com_QD_Click() 过程中,
在这个过程中我写了很多控制程序,示意如下:
Private Sub Com_QD_Click()
步骤1:
串口输出动作
其他任务代码
异常---exit sub
sleep(1000) ;延时1s
步骤2:
串口输出动作
其他任务代码
异常---exit sub
sleep(1000);延时1s
......
延时 n 秒
......
......
......
步骤n:
任务
end sub
进入这个过程后,需要执行很多的任务,要过很长时间(好几十秒),在此段时间内,如果用鼠标去点击界面上的取消按钮,取消当前系统动作,发现按钮没有取消触发事件。原因我知道这是因为程序还停留在上个事件过程中。
我想到一个解决方法,就是 把 程序中使用的 延时程序 sleep(1000),改成定时器中断的方式,在使能定时器前,标志当前程序走到“步骤几”,然后在定时器中断内,接着写控制输出的代码。但是如果这样做的话,岂不是要写很多的 标识符,去标志“步骤”,然后又去定时器中断内判断“步骤几”,这样还打乱控制程序的结构!
怎么办????? 流程控制 vb 疑惑
[解决办法]
Option Explicit
Dim i As Long
Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1000
End Sub
Private Sub Timer1_Timer()
i = i + 1
If i = 1 Then
'步骤1:
'串口输出动作
' 其他任务代码
'异常---exit sub
ElseIf i = 2 Then
'步骤2
ElseIf i = 3 Then
'步骤3
'.......
ElseIf i = 20 Then
'步骤20
'串口输出动作
' 其他任务代码
'异常---exit sub
i = 0
End If
End Sub
'接收放OnComm事件处理
Option Explicit
Dim i As Long
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1000
End Sub
Private Sub Timer1_Timer()
i = i + 1
If i = 1 Then
'步骤1:
'串口输出动作
' 其他任务代码
'异常---exit sub
ElseIf i = 2 Then
'步骤2
ElseIf i = 3 Then
'步骤3
'.......
ElseIf i = 20 Then
'步骤20
'串口输出动作
' 其他任务代码
'异常---exit sub
i = 0
Timer1.Enabled = False
End If
End Sub
'接收放OnComm事件处理
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private mlFlag As Long
' *** 可控延时过程 ***
' 入口参数:
' MillSec 等待时间(毫秒)
' WaitFlag 外部控制标志(置0立即结束等待)
Private Function WaitTime(ByVal MillSec As Long, Optional _
ByRef WaitFlag As Long = T) As Long
Dim lBgnTime As Long, lRet As Long
If (Z > MillSec) Then lRet = T: GoTo E_InvalidVal
lBgnTime = GetTickCount()
Do
Call Sleep(10&): DoEvents
If (Z = WaitFlag) Then lRet = 1&: Exit Do
If ((GetTickCount() - lBgnTime) >= MillSec) Then lRet = Z: Exit Do
Loop
E_InvalidVal:
WaitTime = lRet
End Function
Private Sub Command1_Click()
' “延时任务”流程 应用示例
Dim i&, lRlt&
mlFlag = 1 '设置任意非0值
For i = 1 To 8
Print Timer()
lRlt = WaitTime(2000, mlFlag)
If (lRlt = 1) Then
Print "用户中断……"
Exit Sub
End If
Next
End Sub
Private Sub Command2_Click()
' 点击“取消”
mlFlag = 0
End Sub
Private Sub Com_QD_Click()
mlFlag = 1 ' 注意这句
'步骤1:
' 串口输出动作
' 其他任务代码
' 异常---exit sub
'sleep(1000) ;延时1s
' 延时1秒。 如果“取消”就退出
If (WaitTime(1000, mlFlag) = 1) Then Exit Sub
步骤2:
串口输出动作
其他任务代码
异常---exit sub
'sleep(1000) ;延时1s
' 延时1秒。 如果“取消”就退出
If (WaitTime(1000, mlFlag) = 1) Then Exit Sub
......
' 延时 n 秒
If (WaitTime( n , mlFlag) = 1) Then Exit Sub
......
......
......
步骤n:
任务
End Sub
' *** 可控延时过程 ***
' 入口参数:
' MillSec 等待时间(毫秒)
' WaitFlag 外部控制标志(置0立即结束等待)
Private Function WaitTime(ByVal MillSec As Long, Optional _
ByRef WaitFlag As Long = -1) As Long
Dim lBgnTime As Long, lRet As Long
If (0 > MillSec) Then lRet = -1: GoTo E_InvalidVal
lBgnTime = GetTickCount()
Do
Call Sleep(10&): DoEvents
If (0 = WaitFlag) Then lRet = 1&: Exit Do
If ((GetTickCount() - lBgnTime) >= MillSec) Then lRet = 0: Exit Do
Loop
E_InvalidVal:
WaitTime = lRet
End Function