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

ЖАНРЫ

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

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:

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

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

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

'Зафиксировать время

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

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

'Код, обрабатывающий событие щелчка на кнопке Button2 формы

'Вызвать функцию поиска простого числа из другого потока!

'(Данный поток блокироваться не будет)

'Для отслеживания состояния выполнения задачи используем конечный автомат

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

Private Sub Button2_Click(ByVal senderAs System.Object, _

ByVal eAs System.EventArgs) Handles Button2.Click

Dim testItem As Long

testItem = System.Convert.ToInt64("123456789012345")

Dim nextPrimeFinderAs FindNextPrimeNumber

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