Чтение онлайн

ЖАНРЫ

Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:

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

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

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:

'Выход. К этому моменту либо от другого потока поступила

'команда прекратить поиск, либо было найдено и записано

'следующее наибольшее простое число

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

'сообщить, что выполнение процесса прекращено

If (m_processingState = ProcessingState.requestAbort) Then

setProcessingState(ProcessingState.aborted)

End If

End Sub

'Вспомогательная функция, которая проверяет, является

'ли число простым

Private Function isItemPrime(ByVal potentialPrime _

As Long) As Boolean

'Если число - четное, значит, оно не является простым

If ((potentialPrime And 1) = 0) Then

Return False

End If

'Продолжать поиск до тех пор, пока не будет превышено значение

'квадратного корня из числа

Поделиться с друзьями: