Шрифт:
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
'-----------------------------------------------------------
Public Sub findNextHighestPrime_Async
Dim threadStart As 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 (m_processingState = ProcessingState.requestAbort) Then
GoTo finished_looking
End If
'Состояние должно отвечать, что поиск продолжается
setProcessingState(ProcessingState.lookingForPrime)
Dim currentItem As Long
'Проверить, является ли число нечетным
If ((m_startPoint And 1) = 1) Then
'Число является нечетным, начать поиск со следующего нечетного числа
currentItem = m_startPoint + 2
Else
'Число является четным, начать поиск со следующего нечетного числа
currentItem = m_startPoint + 1
End If
'Приступить к поиску простого числа
While (m_processingState = ProcessingState.lookingForPrime)
'B случае нахождения простого числа, возвратить его
If (isItemPrime(currentItem) = True) Then
m_NextHighestPrime = currentItem
'Обновить состояние
setProcessingState(ProcessingState.foundPrime)
End If
currentItem = currentItem + 2
End While
finished_looking:
'Выход. К этому моменту либо от другого потока поступила
'команда прекратить поиск, либо было найдено и записано
'следующее наибольшее простое число
'Если поступил запрос прекратить выполнение,