title: How to gracefully exit from the middle of a nested subroutine when user cancels?
body: <p>(I'm using VB6 but I imagine this comes up in most other languages.)</p>
  
  <p>I've got a GUI button that calls a routine that takes a minute or two to complete.  I want impatient users to be able to click on the button a second time to have it gracefully exit out of the routine at any point.</p>
  
  <p>I used a static variable to make this work pretty well (see code below), but I'm cleaning up the project and I want to put the For/Next loop into its own function, since it's required in several different places in the project.  </p>
  
  <p>But doing that would break my static flag embedded in the for/next, so I need to make some changes.  Before I do something hare-brained with public (global) variables, I thought I'd ask what other (smarter, perhaps actually CS educated) people have done when faced with this problem.</p>
  
  <p>So basically my question is how do I replicate this:</p>
  
  <pre><code>Private Sub DoSomething_Click()
  
    Static ExitThisSub As Boolean ' Needed for graceful exit
  
    If DoSomething.Caption = "Click To Stop Doing Something" Then
      ExitThisSub = False ' this is the first time we've entered this sub
    Else ' We've re-entered this routine (user clicked on button to stop it)
      ExitThisSub = True ' Set this so we'll see it when we exit this re-entry
      Exit Sub '
    End If
  
  
    DoSomething.Caption = "Click To Stop Doing Something"
  
    For i = 0 To ReallyBigNumber
      Call DoingSomethingSomewhatTimeConsuming
      If ExitThisSub = True Then GoTo ExitThisSubNow
      DoEvents
    Next
  
    ' The next line was missing from my original example,
    ' prompting appropriate comments
    DoSomething.Caption = "Click To Do Something"
  
    Exit Sub
  
  ExitThisSubNow:
  
    ExitThisSub = False ' clear this so we can reenter later
    DoSomething.Caption = "Click To Do Something"
  
  End Sub
  </code></pre>
  
  <p>When I move the for/next loop to its own function?</p>
  
  <p>I'm thinking I'll change ExitThisSub to a public variable QuitDoingSoManyLongCalculations that will exit the new for/next sub and then the DoSomething_Click in the same way.  </p>
  
  <p>But I always feel like an amateur (which I am) when I use global variables - is there a more elegant solution?</p>