现在有一个窗体 窗体上有一个按钮 并且窗体代码里面有这样一个过程sub XXX()
         '这里有很多代码,需要一定时间才能完成
End subPrivate Sub Command1_Click()
         XXX'调用XXX过程
End sub现在我按下按钮,于是调用了XXX过程,我在XXX过程运行完毕之前再次按下按钮,于是之前的XXX被停下,开始运行第二个XXX过程,等第二个XXX执行完毕了,第一个XXX过程从被打断的地方继续运行.如果我现在希望第二个xxx过程执行完毕以后,不让之前的xxx过程继续运行应该怎么办呢?

解决方案 »

  1.   

    你最后那句话不科学。过程没有运行完毕,就不允许再次运行,不然会死机。应该这样:Option ExplicitDim RunEnd As Boolean, i As IntegerPrivate Sub XXX()
            
            '这里有很多代码,需要一定时间才能完成
            MsgBox ("运行了" & i + 1 & "次")
             '运行结束时
             RunEnd = True: i = i + 1
    End Sub
    Private Sub Form_Load()
            RunEnd = False: i = 0
    End Sub
    Private Sub Command1_Click()
            If i = 0 Or RunEnd Then
               XXX  '调用XXX过程
             else
               msgbox("过程没有运行完毕!")
            End If
    End Sub
      

  2.   

    Private Sub Command1_Click()
            Command1.Enabled = False 
            XXX'调用XXX过程
             Command1.Enabled = True 
    End sub 
      

  3.   

    如果你是希望后启动的过程取消正在执行的过程:Dim blnStop As Boolean, blnRunning As Booleansub XXX() 
            blnStop = False
            blnRunning = True        '这里有很多代码,需要一定时间才能完成
             '......
             '在循环中
             DoEvents
            If blnStop Then
                blnRunning = False
                Exit Sub
            End If
            '......
            blnRunning = False 
    End sub Private Sub Command1_Click()
            blnStop = True
            Do While blnRunning
                DoEvents
            Loop 
            XXX'调用XXX过程 
    End sub 实际上,相当于:
    1 调用者向过程喊道:“停下来!”。
    2 等听到过程回答:“停了。”调用者再喊:“跑起来!”
      

  4.   

    按照这个思路把代码修改了一下,发现如果运行第二个实例会被卡死在Command1_Click的do循环里面
    请看看是不是我哪里理解错误了
    Option ExplicitDim blnStop As Boolean, blnRunning As Boolean
    Dim i As Long '循环用变量
    Dim RunIndex As Integer '用来标记过程运行的实例号Sub XXX()
        RunIndex = RunIndex + 1 '每次启动过程'实例编号被+1    Dim M_RunIndex As Integer '过程内部变量,用来识别这个过程的实例编号    M_RunIndex = RunIndex    Debug.Print "XXX  开始运行  实例号=", M_RunIndex
        blnStop = False
        blnRunning = True
        
        For i = 0 To 1000000 '这里有很多代码,需要一定时间才能完成        DoEvents        If blnStop Then
                blnRunning = False
                Debug.Print "被打断"            GoTo BreakSub
     
            End If    NextBreakSub:    blnRunning = False
        Debug.Print "XXX  结束运行  实例号=", M_RunIndex
        RunIndex = RunIndex - 1 '每次结束过程'实例编号被-1
    End SubPrivate Sub Command1_Click()
            blnStop = True
            Do While blnRunning
                DoEvents
            Loop
            XXX '调用XXX过程
    End Sub
      

  5.   

    还有一个问题  在需要效率的循环里面加上doevents效率的影响太大了
      

  6.   

    根据3楼的思路解决了
    不过不是在do loop里面来检测是否所有的过程实例都已经自我了断了
    而是加了一个timer