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

ЖАНРЫ

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

'Отобразить строку

MsgBox("String : " + total_result)

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

MsgBox(PerformanceSampling.GetSampleDurationText(1))

End Sub

Примеры к главе 9 (производительность и многопоточное выполнение)

Листинг 9.1. Код для управления выполнением одиночной задачи фоновым потоком

Option Strict On

Imports System

Public Class ThreadExecuteTask

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

Public Enum ProcessingState

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

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

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

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

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)

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

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