Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to gracefully exit from the middle of a nested subroutine when user cancels?
    text
    copied!<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>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload