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

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

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

Public Class Test1

Public m_loopX As Integer

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

'Функция, вызываемая фоновым потоком

' [in] threadExecute: Класс, управляющий выполнением нашего потока.

' Мы можем контролировать его для проверки

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

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

Public Sub ThreadEntryPoint(ByVal threadExecute As _

 ThreadExecuteTask)

 'Это окно сообщений будет отображаться в контексте того потока,

 'в котором выполняется задача MsgBox("Выполнение ТЕСТОВОГО ПОТОКА")

 '-------

 ' 60 раз

 '-------

 For m_loopX = 1 To 60

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

  If (threadExecute.State = _

   ThreadExecuteTask.ProcessingState.requestAbort) Then

   threadExecute.setProcessingState( _

    ThreadExecuteTask.ProcessingState.aborted)

   Return

  End If

  'Имитировать выполнение работы: пауза 1/3 секунды

  System.Threading.Thread.Sleep(333)

 Next

End Sub

End Class

Листинг 9.3. Код для запуска и тестирования приведенного выше тестового кода

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

Private m_threadExecute As ThreadExecuteTask

'Класс, метод которого мы хотим выполнять в асинхронном режиме

Private m_testMe As Test1

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

'Этот код должен быть запущен ранее другого кода, поскольку он запускает

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

'

'Создать новый поток и обеспечить его выполнение

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

Private Sub buttonStartAsyncExecution_Click(ByVal sender _

 As System.Object, ByVal e As System.EventArgs) _

 Handles buttonStartAsyncExecution.Click

 'Создать экземпляр класса, метод которого мы хотим вызвать

 'в другом потоке

 m_testMe = New Test1

 'Упаковать точку входа метода класса в делегат

 Dim delegateCallCode As _

  ThreadExecuteTask.ExecuteMeOnAnotherThread

 delegateCallCode = _

  New ThreadExecuteTask.ExecuteMeOnAnotherThread(AddressOf _

  m_testMe.ThreadEntryPoint)

 'Дать команду начать выполнение потока!

 m_threadExecute = New ThreadExecuteTask(delegateCallCode)

End Sub

'Принудительно вызвать запрещенное изменение состояния (это приведет

'к возбуждению исключения)

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

 ByVal e As System.EventArgs) _

 Handles buttonCauseException.Click

 m_threadExecute.setProcessingState( _

  ThreadExecuteTask.ProcessingState.notYetStarted)

End Sub

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

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

 ByVal e As System.EventArgs) Handles buttonAbort.Click

 m_threadExecute.setProcessingState( _

  ThreadExecuteTask.ProcessingState.requestAbort)

End Sub

'Проверить состояние выполнения

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

 ByVal e As System.EventArgs) Handles ButtonCheckStatus.Click

 'Запросить у класса управления потоком, в каком состоянии он находится

 MsgBox(m_threadExecute.State.ToString())

 'Запросить класс, метод которого выполняется в потоке,

 'o состоянии выполнения

 MsgBox(m_testMe.m_loopX.ToString())

End Sub

Листинг 9.4. Код, который должен быть помещен в класс Smartphone Form1.cs

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

'Весь этот код должен находиться внутри класса Form1.cs

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

'Объект, который будет выполнять все фоновые вычисления

Private m_findNextPrimeNumber As FindNextPrimeNumber

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

'Обновить текст, информирующий о состоянии...

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

Sub setCalculationStatusText(ByVal text As String)

 Label1.Text = text

End Sub

Private Sub menuItemExit_Click(ByVal sender As _

 System.Object, ByVal e As System.EventArgs) _

 Handles menuItemExit.Click

 Me.Close()

End Sub

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

'Пункт меню для начала фоновых вычислений

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

Private Sub menuItemStart Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) _

 Handles menuItemStart.Click

 'Число, с которого мы хотим начать поиск

 Dim startNumber As Long = System.Convert.ToInt64(TextBox1.Text)

 'Установить фоновое выполнение

 m_findNextPrimeNumber = New FindNextPrimeNumber(startNumber)

 'Запустить выполнение задачи в фоновом режиме...

 m_findNextPrimeNumber.findNextHighestPrime_Async()

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

 Timer1.Interval = 400 '400 мс

 Timer1.Enabled = True

End Sub

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

'Пункт меню для "отмены" выполняющейся задачи

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

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

 ByVal e As System.EventArgs) Handles menuItemAbort.Click

 'Не делать ничего, если вычисления не выполняются

 If (m_findNextPrimeNumber Is Nothing) Then Return

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

 m_findNextPrimeNumber.setProcessingState( _

  FindNextPrimeNumber.ProcessingState.requestAbort)

 'Немедленно известить пользователя 'o готовности прекратить выполнение...

 setCalculationStatusText("Ожидание прекращения выполнения...")

End Sub

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

'Этот таймер, вызываемый потоком пользовательского интерфейса,

'позволяет отслеживать состояние выполнения 'фоновых вычислений

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

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

 ByVal e As System.EventArgs) Handles Timer1.Tick

 'Если к моменту вызова искомое простое число еще

 'не было найдено, отключить таймер

 If (m_findNextPrimeNumber Is Nothing) Then

  Timer1.Enabled = False

  Return

 End If

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

 'Если выполнение было отменено, освободить объект,

 'осуществляющий поиск, и выключить таймер

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

 If (m_findNextPrimeNumber.getProcessingState = _

  FindNextPrimeNumber.ProcessingState.aborted) Then

  Timer1.Enabled = False

  m_findNextPrimeNumber = Nothing

  setCalculationStatusText("Поиск простого числа отменен")

  Return

 End If

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

 'Удалось ли найти правильный ответ?

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

 If (m_findNextPrimeNumber.getProcessingState = _

  FindNextPrimeNumber.ProcessingState.foundPrime) Then

  Timer1.Enabled = False

  'Отобразить результат

  setCalculationStatusText("Число найдено! Следующее простое число = " + _

   m_findNextPrimeNumber.getPrime().ToString())

  m_findNextPrimeNumber = Nothing

  Return

 End If

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

 'Вычисления продолжаются. Информировать

 'пользователя о состоянии выполнения...

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

 'Получить два выходных значения

 Dim numberCalculationsToFar As Long

 Dim currentItem As Long

 m_findNextPrimeNumber.getExecutionProgressInfo( _

  numberCalculationsToFar, currentItem)

 setCalculationStatusText("Вычисления продолжаются. Поиск в области: " + _

  CStr(currentItem) + ". " + _

  "Для вас выполнено " + CStr(numberCalculationsToFar) + _

  " расчетов!")

End Sub

Листинг 9.5. Код класса FindNextPrimeNumber.cs

Option Strict On

Imports System

Public Class FindNextPrimeNumber

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

Public Enum ProcessingState

 notYetStarted

 waitingToStartAsync

 lookingForPrime

 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

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