Литмир - Электронная Библиотека
Содержание  
A
A

 currentState = getProcessingState()

 If ((currentState = ProcessingState.aborted) _

  OrElse (currentState = ProcessingState.foundPrime)) Then

  Return

 End If

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

 SyncLock (Me)

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

  m_processingState = nextState

 End SyncLock

End Sub

Public Function getProcessingState() As ProcessingState

 Dim currentState As ProcessingState

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

 SyncLock (Me)

  currentState = m_processingState

 End SyncLock

 Return currentState

End Function

Public Function getTickCountDelta() As Integer

 If (getProcessingState() = _

  ProcessingState.lookingForPrime) Then

  Throw New Exception( _

   "Продолжается поиск простого числа! Окончательное время еще не вычислено")

 End If

 Return m_endTickCount - m_startTickCount

End Function

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

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

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

Public Function getPrime() As Long

 If (getProcessingState() <> 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()

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

Public Sub findNextHighestPrime_Async()

 Dim threadStartAs System.Threading.ThreadStart

 threadStart = _

  New System.Threading.ThreadStart( _

  AddressOf findNextHighestPrime)

 Dim newThread As System.Threading.Thread

 newThread = New System.Threading.Thread(threadStart)

 'Состояние должно отвечать, что поиск продолжается

 setProcessingState(ProcessingState.waitingToStartAsync)

 newThread.Start()

End Sub

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

'Основной рабочий поток. Этот поток запускает поиск очередного

'простого числа и выполняется до тех пор, пока не произойдет

'одно из следующих двух событий:

' (а) найдено очередное простое число

' (b) от внешнего (по отношению к данному) потока поступила команда

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

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

Public Sub findNextHighestPrime()

 'Если поступила команда прекратить выполнение, то поиск даже

 'не должен начинаться

 If (getProcessingState() = ProcessingState.requestAbort) Then

  GoTo finished_looking

 End If

 'Состояние должно отвечать, что поиск продолжается

 setProcessingState(ProcessingState.lookingForPrime)

 m_startTickCount = System.Environment.TickCount

 Dim currentItemAs Long

 'Проверить, является ли число нечетным

 If ((m_startPointAnd 1) = 1) Then

  'Число является нечетным, начать поиск со следующего нечетного числа

  currentItem = m_startPoint + 2

 Else

  'Число является четным, начать поиск со следующего нечетного числа

  currentItem = m_startPoint + 1

 End If

 'Приступить к поиску простого числа

 While (getProcessingState() = ProcessingState.lookingForPrime)

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

  If (isItemPrime(currentItem) = True) Then

   m_NextHighestPrime = currentItem

   'Обновить состояние

   setProcessingState(ProcessingState.foundPrime)

  End If

  currentItem = currentItem + 2

 End While

finished_looking:

219
{"b":"947732","o":1}