Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework
System.Convert.ToString( _
(m_perfSamplesDuration(sampleIndex) / CDbl(1000.0)) ) + " секунд."
End Function
End Class
Листинг 7.2. Тестовая программа, демонстрирующая использование приведенного выше кода для измерения временных интерваловPrivate Sub Button1_Click(ByVal senderAs System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Const TEST_SAMPE_INDEXAs Integer = 2 'Выбрать любой допустимый индекс
'Начать измерение
PerformanceSampling.StartSample(TEST_SAMPE_INDEX, "TestSample")
'Отобразить окно сообщений
MsgBox("Для прекращения измерения нажмите кнопку OK")
'Прекратить измерение
PerformanceSampling.StopSample(TEST_SAMPE_INDEX)
'Отобразить результаты
MsgBox(PerformanceSampling.GetSampleDurationText( _
TEST_SAMPE_INDEX))
End Sub
Листинг 7.3. Демонстрация трех различных уровней организации обратной связи с пользователем'Поместить надписи на кнопках
Private Sub Form2_Load(ByVal senderAs System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
button1.Text = "Плохая обратная связь"
button2.Text = "Хорошая обратная связь"
button3.Text = "Улучшенная обратная связь"
End Sub
'---------------------------------------------------------------------------
'Пример слабых интерактивных возможностей интерфейса:
' - Визуальная индикация начала выполнения работы отсутствует
' - Визуальная индикация окончания выполнения работы отсутствует
' - Пользовательский интерфейс не способен к отклику в процессе работы
' - 0 завершении выполнения задачи пользователь вынужден только догадываться
'---------------------------------------------------------------------------
Private Sub Button1_Click(ByVal senderAs System.Object, _
ByVal eAs System.EventArgs) Handles Button1.Click
'Имитировать выполнение работы путем создания паузы продолжительностью
'4 секунды
System.Threading.Thread.Sleep(4000)
End Sub
'------------------------------------------------------------------------
'Пример лучших интерактивных возможностей интерфейса:
' + Визуальная индикация начала выполнения работы
' (появление курсора ожидания)
' + Визуальная индикация окончания выполнения работы
' (исчезновение курсора ожидания)
' - Пользовательский интерфейс не способен к отклику в процессе работы
' + По завершении выполнения задачи конечный пользователь узнает об этом,
' а пользовательский интерфейс восстанавливает способность к отклику
'------------------------------------------------------------------------
Private Sub Button2_Click(ByVal senderAs System.Object, _
ByVal eAs System.EventArgs) Handles Button2.Click
System.Windows.Forms.Cursor.Current = _
System.Windows.Forms.Cursors.WaitCursor
'Имитировать выполнение работы путем создания паузы продолжительностью
'4 секунды
System.Threading.Thread.Sleep(4000)
System.Windows.Forms.Cursor.Current = _
System.Windows.Forms.Cursors.Default
End Sub
'-------------------------------------------------------------------------
'Пример еще лучших интерактивных возможностей интерфейса:
' + Визуальная индикация начала выполнения работы
' (появление курсора ожидания)
' + Отображение дополнительного текста, сообщающего пользователю
' о том, что происходит
' + Визуальная индикация окончания выполнения работы
' (исчезновение курсора ожидания)
' - Пользовательский интерфейс не способен к отклику в процессе работы
' + По завершении выполнения задачи конечный пользователь узнает об этом,
' а пользовательский интерфейс восстанавливает способность к отклику
' + Текстовые сообщения информируют пользователя о том, что происходит
'-------------------------------------------------------------------------
Private Sub Button3_Click(ByVal senderAs System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click
'Предоставить пользователю текст, информирующий его обо всем происходящем
Label1.Text = "Ждите! Работа выполняется!"
'Заставить ПИ обновить текст
'(иначе он сделает это только тогда, когда будет перерисовывать сообщение,
'а это может произойти и после выхода из данной функции)
Label1.Update()
'Отобразить курсор ожидания
System.Windows.Forms.Cursor.Current = _
System.Windows.Forms.Cursors WaitCursor
'Имитировать выполнение работы путем создания паузы продолжительностью
'2,8 секунды
System.Threading.Thread.Sleep(2800)
'Необязательное дополнительное обновление состояния
Label1.Text = "Ждите! Работа близка к завершению!"
Label1.Update()
'Имитировать выполнение работы путем создания паузы продолжительностью
'1,2 секунды
System.Threading.Thread.Sleep(1200)
'Известить пользователя текстовым сообщением о завершении работы
'(текст обновляется всякий раз, когда ПИ выполняет обычное обновление
'экрана)
Label1.Text = "Работа успешно завершена!"
'Избавиться от курсора ожидания
System.Windows.Forms.Cursor.Current = _
System.Windows.Forms.Cursors.Default
End Sub
Листинг 7.4. Сравнение производительности двух алгоритмов, в одном из которых используются исключения, а во втором — нет'==================================================================
'Примечание. В этом примере используется класс PerformanceSampling,
' определенный ранее в этой главе. Убедитесь в том, что
' этот класс включен в проект
'ТЕСТОВАЯ ФУНКЦИЯ:
'Сложить n1 и n2 и возвратить результат
'в n3
' Возвращаемое значение:
' TRUE: если результат положителен
' FALSE: если результат отрицателен
'==================================================================
Function returnFalseIfLessThanZero_Add2Numbers( _
ByVal n1As Integer, ByVal n2 As Integer, _
ByRef n3 As Integer) As Boolean
n3 = n1 + n2
'Результат меньше 0?
If (n3 < 0) Then
Return False
End If
Return True
End Function
'========================================================================
'ТЕСТОВАЯ ФУНКЦИЯ:
'Сложить n1 и n2 и возвратить результат
'в n3
'Если n3 меньше 0, то функция ПЕРЕДАЕТ УПРАВЛЕНИЕ ОБРАБОТЧИКУ ИСКЛЮЧЕНИЙ.
'В противном случае возвращается TRUE
'========================================================================
Function exceptionIfLessThanZero_Add2Numbers( _
ByVal n1As Integer, ByVal n2As Integer, _
ByRef n3 As Integer) As Boolean
n3 = n1 + n2
'Результат меньше 0?
If (n3 <0) Then
Throw New Exception("Результат меньше 0!")
End If
Return True
End Function
'=======================================================
'Осуществляет многократные вызовы простой функции и
'измеряет общее время выполнения
'Вызываемая функция НЕ приводит к возбуждению исключений
'=======================================================
Private Sub buttonRunNoExceptionCode_Click(ByVal senderAs System.Object, _
ByVal eAs System.EventArgs) Handles buttonRunNoExceptionCode.Click
Const TEST_NUMBERAs Integer = 0
Dim numberItterations As Integer
numberItterations = _
CInt(textBoxNumberAttempts.Text)
'Отобразить количество итераций, которые предстоит выполнить
ListBox1.Items.Add("=>" + numberItterations.ToString() + " итераций")
Dim count_SumLessThanZero As Integer
Dim dataOut As Integer
'----------------
'Запустить таймер
'----------------
PerformanceSampling.StartSample(TEST_NUMBER, "Исключения отсутствуют")
'------------------------------------------------------
'Выполнить цикл, в котором осуществляется вызов функции
'------------------------------------------------------
count_SumLessThanZero = 0
Dim sumGreaterThanZero As Boolean
Dim i As Integer
While (i < numberItterations)
'=========================
'Вызвать тестовую функцию!
'=========================
sumGreaterThanZero = _
returnFalseIfLessThanZero_Add2Numbers(-2, -3, dataOut)
If (sumGreaterThanZero = False) Then
count_SumLessThanZero = count_SumLessThanZero + 1
End If
i = i + 1
End While
'-----------------
'Остановить таймер
'-----------------
PerformanceSampling.StopSample(TEST_NUMBER)
'--------------------------------
'Показать результаты пользователю
'--------------------------------
If (count_SumLessThanZero = numberItterations) Then