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

ЖАНРЫ

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

setCalculationStatusText("Ожидание прекращения выполнения...")

End Sub

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

'Этот таймер, вызываемый потоком пользовательского интерфейса,

'позволяет отслеживать состояние выполнения 'фоновых вычислений

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

Private Sub Timer1_Tick(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Timer1.Tick

'Если к моменту вызова искомое простое число еще

'не было найдено, отключить таймер

If (m_findNextPrimeNumber Is Nothing) Then

Timer1.Enabled = False

Return

End If

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

'Если выполнение было отменено, освободить объект,

'осуществляющий поиск, и выключить таймер

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

If (m_findNextPrimeNumber.getProcessingState = _

FindNextPrimeNumber.ProcessingState.aborted) Then

Timer1.Enabled = False

m_findNextPrimeNumber = Nothing

setCalculationStatusText("Поиск простого числа отменен")

Return

End If

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

'Удалось ли найти правильный ответ?

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

If (m_findNextPrimeNumber.getProcessingState = _

FindNextPrimeNumber.ProcessingState.foundPrime) Then

Timer1.Enabled = False

'Отобразить результат

setCalculationStatusText("Число найдено! Следующее простое число = " + _

m_findNextPrimeNumber.getPrime.ToString)

m_findNextPrimeNumber = Nothing

Return

End If

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

'Вычисления продолжаются. Информировать

'пользователя о состоянии выполнения...

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

'Получить два выходных значения

Dim numberCalculationsToFar As Long

Dim currentItem As Long

m_findNextPrimeNumber.getExecutionProgressInfo( _

numberCalculationsToFar, currentItem)

setCalculationStatusText("Вычисления продолжаются. Поиск в области: " + _

CStr(currentItem) + ". " + _

"Для вас выполнено " + CStr(numberCalculationsToFar) + _

" расчетов!")

End Sub

Листинг 9.5. Код класса FindNextPrimeNumber.cs

Option Strict On

Imports System

Public Class FindNextPrimeNumber

'Перечисляем возможные состояния

Public Enum ProcessingState

notYetStarted

waitingToStartAsync

lookingForPrime

foundPrime

requestAbort

aborted

End Enum

Private m_startPoint As Long

Private m_NextHighestPrime As Long

'Поиск какого количества элементов выполнен?

Private m_comparisonsSoFar As Long

'Для какого элемента сейчас выполняется поиск простого числа?

Private m_CurrentNumberBeingExamined As Long

'Вызывается для обновления информации о состоянии выполнения

Public Sub getExecutionProgressInfo( _

ByRef numberCalculationsSoFar As Long, _

ByRef currentItemBeingLookedAt As Long)

'ПРИМЕЧАНИЕ. Мы используем блокирование потока для уверенности в том,

'что эти значения не считываются во время выполнения операции

'их записи. Поскольку доступ к m_comparisonsSoFar

'и m_CurrentNumberBeingExamined могут осуществлять

'одновременно несколько потоков, любая выполняемая над ними

'операция записи/считывания должна синхронизироваться с "блокировкой",

'что будет гарантировать "атомарность" этих операций

SyncLock (Me)

numberCalculationsSoFar = m_comparisonsSoFar

currentItemBeingLookedAt = m_CurrentNumberBeingExamined

End SyncLock

End Sub

Private m_processingState As ProcessingState

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

'Простейший конечный автомат

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

Public Sub setProcessingState(ByVal nextState As _

ProcessingState)

'Простейший защитный код, гарантирующий

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

'либо успешно завершена, либо успешно отменена

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