Программирование мобильных устройств на платформе .NET Compact Framework (Салмре) - страница 546

> 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)

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

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

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

> 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)