Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 182 183 184 185 186 187 188 189 190 ... 206
Перейти на страницу:

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

 MsgBox(PerformanceSampling.GetSampleDurationText(0))

End Sub

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

'ГОРАЗДО БОЛЕЕ ЭФФЕКТИВНЫЙ АЛГОРИТМ!

'Для имитации создания типичного набора строк используется

'конструктор строк (String Builder)

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

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

 ByVal e As System.EventArgs) Handles Button2.Click

 'Вызвать сборщик мусора, чтобы тест

 'начинался с чистого состояния.

 'ПРИБЕГАЙТЕ К ЭТОЙ МЕРЕ ТОЛЬКО В ЦЕЛЯХ ТЕСТИРОВАНИЯ! Вызовы

 'сборщика мусора в программах вручную будут приводить к снижению

 'общей производительности приложений!

 System.GC.Collect()

 Dim sb As System.Text.StringBuilder = _

  New System.Text.StringBuilder

 Dim total_result As String

 Dim numberToStore As Integer

 PerformanceSampling.StartSample(1, "StringBuilder")

 Dim outer_loop As Integer

 For outer_loop = 1 To LOOP_ITERATIONS

  'Очистить конструктор строк

  sb.Length = 0

  'Очистить строку со старым результатом

  total_result = ""

  'Выполнять цикл до максимального значения x_counter, каждый раз

  'присоединяя очередную тестовую строку к рабочей строке

  Dim x_counter As Integer

  For x_counter = 1 To COUNT_UNTIL

   sb.Append(numberToStore)

   sb.Append(", ")

   'Увеличить значение счетчика

   numberToStore = numberToStore + 1

  Next

  'Имитируем выполнение некоторых операций над строкой...

  total_result = sb.ToString()

 Next

 PerformanceSampling StopSample(1)

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

 MsgBox("Длина строки: " + total_result.Length.ToString())

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

 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)

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

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

  If (m_processingState = nextState) Then

   Return

  End If

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

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

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

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

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

  If ((m_processingState = ProcessingState.aborted) OrElse _

   (m_processingState = ProcessingState.done)) Then

   Return

  End If

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

  Select Case (nextState)

  Case ProcessingState.notYetStarted

   Throw New Exception _

    ("Переход в состояние 'notYetStarted' невозможен")

  Case ProcessingState.waitingToStartAsync

   If (m_processingState <> ProcessingState.notYetStarted) Then

    Throw New Exception("Недопустимое изменение состояния")

   End If

  Case ProcessingState.running

   If (m_processingState <> _

    ProcessingState.waitingToStartAsync) Then

    Throw New Ехсерtion("Недопустимое изменение состояния")

   End If

  Case ProcessingState.done

   'Мы можем завершить работу лишь тогда, когда она выполняется.

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

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

   If ((m_processingState <> ProcessingState.running) AndAlso _

    (m_processingState <> ProcessingState.requestAbort)) Then

    Throw New Exception("Недопустимое изменение состояния")

   End If

  Case ProcessingState.aborted

   If (m_processingState <> ProcessingState.requestAbort) Then

    Throw New Exception("Недопустимое изменение состояния")

   End If

  End Select

  'Разрешить изменение состояния

  m_processingState = nextState

 End SyncLock

End Sub

Public ReadOnly Property State() As ProcessingState

 Get

  Dim currentState As ProcessingState

  'Предотвратить попытки одновременного чтения/записи состояния

  SyncLock (m_useForStateMachineLock)

   currentState = m_orocessingState

  End SyncLock

  Return currentState

 End Get

End Property

End Class

Листинг 9.2. Тестовая программа для выполнения работы в фоновом потоке

Option Strict On

Imports System

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

'Тестовый код, который используется для выполнения фоновым

'потоком

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

1 ... 182 183 184 185 186 187 188 189 190 ... 206
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре.
Комментарии