"Для вас выполнено " + CStr(numberCalculationsToFar) + _

  " расчетов!")

End Sub

Листинг 9.5. Код класса FindNextPrimeNumber.cs

Option Strict On

Imports System

Public Class FindNextPrimeNumber

'Перечисляем возможные состояния

Public Enum ProcessingState

 notYetStarted

 waitingToStartAsync

 lookingForPrime

 foundPrime

 requestAbort

 aborted

End Enum

Private m_startPoint As Long

Private m_NextHighestPrime As Long

'Поиск какого количества элементов выполнен?

Private m_comparisonsSoFar As Long

'Для какого элемента сейчас выполняется поиск простого числа?

Private m_CurrentNumberBeingExamined As Long

'Вызывается для обновления информации о состоянии выполнения

Public Sub getExecutionProgressInfo( _

 ByRef numberCalculationsSoFar As Long, _

 ByRef currentItemBeingLookedAt As Long)

 'ПРИМЕЧАНИЕ. Мы используем блокирование потока для уверенности в том,

 'что эти значения не считываются во время выполнения операции

 'их записи. Поскольку доступ к m_comparisonsSoFar

 'и m_CurrentNumberBeingExamined могут осуществлять

 'одновременно несколько потоков, любая выполняемая над ними

 'операция записи/считывания должна синхронизироваться с "блокировкой",

 'что будет гарантировать "атомарность" этих операций

 SyncLock (Me)

  numberCalculationsSoFar = m_comparisonsSoFar

  currentItemBeingLookedAt = m_CurrentNumberBeingExamined

 End SyncLock

End Sub

Private m_processingState As ProcessingState

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

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

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

Public Sub setProcessingState(ByVal nextState As _

 ProcessingState)

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

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

 'либо успешно завершена, либо успешно отменена

 If ((m_processingState = ProcessingState.aborted) _

  OrElse (m_processingState = ProcessingState.foundPrime)) Then

  Return

 End If

 'Разрешить изменение состояния

 m_processingState = nextState

End Sub

Public ReadOnly Property getProcessingState As ProcessingState

 Get

  Return m_processingState

 End Get

End Property

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

'Возвращает простое число

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

Public Function getPrime As Long

 If (m_processingState <> ProcessingState.foundPrime) Then

  Throw New Exception("Простое число еще не найдено!")

 End If

 Return m_NextHighestPrime

End Function

'Конструктор класса

Public Sub New(ByVal startPoint As Long)

 setProcessingState(ProcessingState.notYetStarted)

 m_startPoint = startPoint

End Sub

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

'Создает новый рабочий поток, который будет вызывать функцию

'findNextHighestPrime

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

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

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