首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB 干流程控制的疑惑

2013-09-07 
VB 做流程控制的疑惑?现在用VB做一个小小的项目,遇到问题,望好心人,指点迷津!描述如下:系统界面上有两个按

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

热点排行