Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:
'----------------------------------------------------------------------
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Вызвать главную функцию для изменения состояния
ChangeApplicationState(MyStates.step2)
End Sub
'-------------------------------------
'Код, выполняющийся при загрузке формы
'-------------------------------------
Private Sub Forml_Load(ByVal sender As Object, _
ByVal eAs System.EventArgs)
'Вызвать
главную функцию для изменения состояния
ChangeApplicationState(MyStates.step1)
End Sub
Листинг 5.4. Код программы нахождения простых чисел, предназначенный для выполнения фоновым потоком
Option Strict On
Imports System
Public Class FindNextPrimeNumber
'Определить возможные состояния
Public Enum ProcessingState
notYetStarted
waitingToStartAsync
lookingForPrime
foundPrime
requestAbort
aborted
End Enum
Private m_startTickCount As Integer
Private m_endTickCount As Integer
Private m_startPoint As Long
Private m_NextHighestPrime As Long
Private m_processingState As ProcessingState
'---------------------------
'Простейший конечный автомат
'---------------------------
Public Sub setProcessingState(ByVal nextState As ProcessingState)
'------------------------------------------------------------
'Простейший защитный код, гарантирующий
'невозможность перехода в другое состояние в случае успешного
'завершения задачи или успешной отмены ее выполнения
'------------------------------------------------------------
Dim currentState As ProcessingState
currentState = getProcessingState
If ((currentState = ProcessingState.aborted) _
OrElse (currentState = ProcessingState.foundPrime)) Then
Return
End If
'Безопасное параллельное выполнение потоков
SyncLock (Me)
'Разрешить изменение состояния
m_processingState = nextState
End SyncLock
End Sub
Public Function getProcessingState As ProcessingState
Dim currentState As ProcessingState
'Безопасное
параллельное выполнение потоков
SyncLock (Me)
currentState = m_processingState
End SyncLock
Return currentState
End Function
Public Function getTickCountDelta As Integer
If (getProcessingState = _
ProcessingState.lookingForPrime) Then
Throw New Exception( _
"Продолжается поиск простого числа! Окончательное время еще не вычислено")
End If
Return m_endTickCount - m_startTickCount
End Function
'------------------------
'Возвращает простое число
'------------------------
Public Function getPrime As Long
If (getProcessingState <> 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 threadStartAs 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
'------------------------------------------------------------------
'Основной рабочий поток. Этот поток запускает поиск очередного
'простого числа и выполняется до тех пор, пока не произойдет
'одно из следующих двух событий:
Поделиться с друзьями: