(я использую VB6, но я думаю, что это встречается в большинстве других языков.)
У меня есть кнопка с графическим интерфейсом, которая вызывает процедуру, которая занимает минуту или две для завершения. Я хочу, чтобы нетерпеливые пользователи могли нажать на кнопку второй раз, чтобы она в любой момент изящно вышла из рутины.
Я использовал статическую переменную, чтобы сделать эту работу довольно хорошо (см. Код ниже), но я очищаю проект и хочу поместить цикл For / Next в его собственную функцию, так как он требуется в нескольких разных местах в проекте.
Но это нарушило бы мой статический флаг, встроенный в for / next, поэтому мне нужно внести некоторые изменения. Перед тем, как сделать что-то с открытыми (глобальными) переменными, я подумал, что я должен спросить, что другие (умнее, возможно, на самом деле образованные в CS) люди сделали, когда столкнулись с этой проблемой.
Итак, в основном мой вопрос, как мне повторить это:
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
Когда я перемещаю цикл for / next к своей собственной функции?
Я думаю, что я изменю ExitThisSub на открытую переменную QuitDoingSoManyLongCalculations, которая будет выходить из новой подпрограммы for / next и затем DoSomething_Click таким же образом.
Но я всегда чувствую себя любителем (которым я являюсь), когда использую глобальные переменные - есть ли более элегантное решение?