Шрифт:
m_NextHighestPrime = currentItem
'Обновить состояние
setProcessingState(ProcessingState.foundPrime)
End If
currentItem = currentItem + 2
End While
finished_looking:
'Выход. К этому моменту либо от другого потока поступила
'команда прекратить поиск, либо было найдено и записано
'следующее наибольшее простое число
'Зафиксировать время
m_endTickCount = System.Environment.TickCount
'Если поступил запрос прекратить выполнение,
'сообщить, что выполнение процесса прекращено
If (getProcessingState = 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
'Продолжать поиск до тех пор, пока не будет превышено значение
'квадратного корня из числа
Dim end_point_of_searchAs Long end_point_of_search = _
CLng(System.Math.Sqrt(potentialPrime) + 1)
Dim current_test_itemAs Long = 3
While (current_test_item <= end_point_of search)
'---------------------------------------------------------
'Проверить, не поступила ли команда прекратить выполнение!
'---------------------------------------------------------
If (getProcessingState <> ProcessingState.lookingForPrime) Then
Return False
End If
'Если число делится без остатка,
'значит, оно не является простым
If (potentialPrimeMod current_test_item = 0) Then
Return False
End If
'Увеличить число на два
current_test_item = current test_item + 2
End While
'Число является простым
Return True
End Function
End Class
Листинг 5.5. Тестовая программа, которая вызывает на выполнение приведенный выше код фонового потока, осуществляющего поиск простого числа
'----------------------------------------------------------
'Код, обрабатывающий событие щелчка на кнопке Button1 формы
'Вызвать из этого потока функцию поиска простого числа!
'(Это приведет к блокированию потока)
'----------------------------------------------------------
Private Sub Button1_Click(ByVal senderAs System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim testItem As Long
testItem = System.Convert.ToInt64("123456789012345")
Dim nextPrimeFinder As FindNextPrimeNumber
nextPrimeFinder = New FindNextPrimeNumber(testItem)
nextPrimeFinder.findNextHighestPrime
Dim nextHighestPrime As Long
nextHighestPrime = nextPrimeFinder.getPrime
MsgBox(CStr(nextHighestPrime))
'Сколько времени заняли вычисления?
Dim calculation_time As Integer
calculationtime = nextPrimeFinder.getTickCountDelta
MsgBox(CStr(calculation time) + " мс")
End Sub
'------------------------------------------------------------------------