读书人

VB 干流程控制的疑惑

发布时间: 2013-09-07 14:12:45 作者: rapoo

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事件处理


[解决办法]
在for或者别的循环语句内部加上
DoEvents
这一行。
[解决办法]
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


[解决办法]
忘记把函数中用到的常量替换成对应数值。
VB 干流程控制的疑惑
' *** 可控延时过程 ***
' 入口参数:
' 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

读书人网 >VB

热点推荐