Листинг 5.3. Явное изменение состояния приложения (удачный подход)

Private m_someImportantInfo As String

'Определить состояния, в которых может находиться приложение

Enum MyStates

 step1

 step2

End Enum

'----------------------------------------------------

'Главная функция, которая

'вызывается всякий раз, когда возникает необходимость

'в изменении состояния приложения

'----------------------------------------------------

Sub ChangeApplicationState(ByVal newStateAs MyStates)

 Select Case newState

 Case MyStates.step1

  TextBox1.Visible = True

  ListBox1.Visible = False

 Case MyStates.step2

  m_someImportantInfo = TextBox1.Text

  TextBox1.Visible = False

  ListBox1.Visible = True

 End Select

End Sub

'----------------------------------------------------------------------

'Пользователь щелкнул на кнопке и хочет перейти к выполнению

'следующего шага данного приложения. Скрыть текстовое окно и отобразить

'окно списка в отведенном для этого месте.

'----------------------------------------------------------------------

Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)

 'Вызвать главную функцию для изменения состояния

 ChangeApplicationState(MyStates.step2)

End Sub

'-------------------------------------

'Код, выполняющийся при загрузке формы

'-------------------------------------

Private Sub Forml_Load(ByVal sender As Object, _

 ByVal eAs System.EventArgs)

 'Вызвать главную функцию для изменения состояния

 ChangeApplicationState(MyStates.step1)

End Sub

Листинг 5.4. Код программы нахождения простых чисел, предназначенный для выполнения фоновым потоком

Option Strict On

Imports System

Public Class FindNextPrimeNumber

'Определить возможные состояния

Public Enum ProcessingState

 notYetStarted

 waitingToStartAsync

 lookingForPrime

 foundPrime

 requestAbort

 aborted

End Enum

Private m_startTickCount As Integer

Private m_endTickCount As Integer

Private m_startPoint As Long

Private m_NextHighestPrime As Long

Private m_processingState As ProcessingState

'---------------------------

'Простейший конечный автомат

'---------------------------

Public Sub setProcessingState(ByVal nextState As ProcessingState)

 '------------------------------------------------------------

 'Простейший защитный код, гарантирующий

 'невозможность перехода в другое состояние в случае успешного

 'завершения задачи или успешной отмены ее выполнения

 '------------------------------------------------------------

 Dim currentState As ProcessingState

 currentState = getProcessingState

 If ((currentState = ProcessingState.aborted) _

  OrElse (currentState = ProcessingState.foundPrime)) Then

  Return

 End If

 'Безопасное параллельное выполнение потоков

 SyncLock (Me)

Перейти на страницу:

Похожие книги