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

ЖАНРЫ

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

Салмре Иво

Шрифт:

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

 'Начальное состояние

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

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

notYetStarted

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

 'Рабочие состояния

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

 'Ожидание запуска фонового потока

 waitingToStartAsync

 'Выполнение кода в фоновом потоке

 running

 'Запросить
отмену выполнения вычислений

 requestAbort

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

 'Состояния завершения

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

 'Состояние завершения: выполнение фонового потока

 'успешно завершено

 done

 'Состояние завершения: выполнение потока отменено

 'до его завершения

 aborted

End Enum

Private m_processingState As ProcessingState

Public Delegate Sub ExecuteMeOnAnotherThread(_

 ByVal checkForAborts As ThreadExecuteTask)

Private m_CallFunction As ExecuteMeOnAnotherThread

Private m_useForStateMachineLock As Object

Public Sub New(ByVal functionToCall As ExecuteMeOnAnotherThread)

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

 'в целях блокировки

 m_useForStateMachineLock = New Object

 'Обозначить готовность к началу выполнения

 m_processingState = ProcessingState.notYetStarted

 'Сохранить функцию, которую необходимо вызвать

 'в новом потоке

 m CallFunction = functionToCall

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

 'Создать новый поток и вызвать в нем функцию на выполнение:

 ' this.ThreadStartPoint

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

 Dim threadStart As System.Threading.ThreadStart threadStart = _

New System.Threading.ThreadStart(AddressOf ThreadStartPoint)

 Dim newThread As System.Threading.Thread

 newThread = New System.Threading.Thread(threadStart)

 'Обозначить готовность к началу выполнения (в целях определенности

 'это важно сделать еще до того, как будет запущен поток!)

 setProcessingState(ProcessingState.waitingToStartAsync)

 'Дать ОС команду начать выполнение нового потока в асинхронном режиме

 newThread.Start

 'Возвратить
управление функции, вызывающей этот поток

End Sub

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

'Эта функция является точкой входа, вызываемой для

'выполнения в новом потоке

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

Private Sub ThreadStartPoint

 'Установить состояние обработки, соответствующее выполнению

 'функции в новом потоке!

 setProcessingState(ProcessingState.running)

 'Запустить на выполнение пользовательский код и передать указатель в наш

 'класс, чтобы этот код мог периодически проверять, не поступил ли запрос

 'на прекращение выполнения

 m_CallFunction (Me)

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

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

 If (m_processingState <> ProcessingState.aborted) Then

'Обозначить завершение выполнения

setProcessingState(ProcessingState.done)

 End If

 'Выйти из потока...

End Sub

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

'Конечный автомат

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

Public Sub setProcessingState(ByVal nextState As _

 ProcessingState)

 'В любой момент времени только одному потоку выполнения могут быть

 'разрешены попытки изменить состояние

 SyncLock (m_useForStateMachineLock)

'В случае попытки повторного вхождения в текущее состояние

'никакие дополнительные действия не выполняются

If (m_processingState = nextState) Then

Return

End If

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

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

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

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

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

If ((m_processingState = ProcessingState.aborted) OrElse _

(m_processingState = ProcessingState.done)) Then

Return

End If

'Убедиться в допустимости данного изменения состояния

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