MsgBox("Тест выполнен")
ListBox1.Items.Add( _
PerformanceSampling.GetSampleDurationText(TEST_NUMBER))
Else
MsgBox("При выполнении теста возникали осложнения")
End If
End Sub
'==================================================
'Осуществляет многократные вызовы простой функции и
'измеряет общее время выполнения.
'Вызываемая функция ВОЗБУЖДАЕТ исключения
'==================================================
Private Sub buttonRunExceptionCode_Click_Click(ByVal senderAs System.Object, _
ByVal e As System.EventArgs) Handles buttonRunExceptionCode_Click.Click
Const TESTNUMBERAs Integer = 1
'Получить количество итераций Dim numberItterationsAs
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)
Try
'=========================
'Вызвать тестовую функцию!
'=========================
sumGreaterThanZero = _
exceptionIfLessThanZero_Add2Numbers(-2, -3, dataOut)
Catch
count_SumLessThanZero = count_SumLessThanZero + 1
End Try
i = i + 1
End While 'конец цикла
'-----------------
'Остановить таймер
'-----------------
PerformanceSampling.StopSample(TEST_NUMBER)
'--------------------------------
'Показать результаты пользователю
'--------------------------------
If (count_SumLessThanZero = numberItterations) Then
MsgBox("Тест выполнен")
ListBox1.Items.Add( _
PerformanceSampling.GetSampleDurationText(TEST_NUMBER))
Else
MsgBox("При выполнении теста возникали осложнения")
End If
End Sub
Примеры к главе 8 (производительность и память)
Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
Option Strict On
Public Class GraphicsGlobals
Private Shared s_Player_Bitmap1 As System.Drawing.Bitmap
Private Shared s_Player_Bitmap2 As System.Drawing.Bitmap
Private Shared s_Player_Bitmap3 As System.Drawing.Bitmap
Private Shared s_Player_Bitmap4 As System.Drawing.Bitmap
Private Shared s_colPlayerBitmaps As _
System.Collections.ArrayList
'----------------------
'Освободить все ресурсы
'----------------------
Public Shared Sub g_PlayerBitmapsCollection_CleanUp()
'Если не загружено ни одно изображение, то и память освобождать не от чего
If (s_colPlayerBitmapsIs Nothing) Then Return
'Дать указание каждому из этих объектов освободить
'любые удерживаемые ими неуправляемые ресурсы
s_Player_Bitmap1.Dispose()
s_Player_Bitmap2.Dispose()
s_Player_Bitmap3.Dispose()
s_Player_Bitmap4.Dispose()
'Обнулить каждую из этих переменных, чтобы им не соответствовали
'никакие объекты в памяти
s_Player_Bitmap1 = Nothing
s_Player_Bitmap2 = Nothing
s_Player_Bitmap3 = Nothing
s_Player_Bitmap4 = Nothing
'Избавиться от массива
s_colPlayerBitmaps = Nothing
End Sub
'-----------------------------------------
'Функция: возвращает коллекцию изображений
'-----------------------------------------
Public Shared Function g_PlayerBitmapsCollection() _
As System.Collections.ArrayList
'---------------------------------------------------------------
'Если изображения уже загружены, их достаточно только возвратить
'---------------------------------------------------------------
If Not (s_colPlayerBitmaps Is Nothing) Then
Return scolPlayerBitmaps
End If
'Загрузить изображения как ресурсы из исполняемого двоичного файла
Dim thisAssemblyAs System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly()
Dim thisAssemblyNameAs System.Reflection.AssemblyName = _
thisAssembly.GetName()
Dim assemblyNameAs String = thisAssemblyName.Name
'Загрузить изображения
s_Player_Bitmap1 =New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_RightRun1.bmp"))
s_Player_Bitmap2 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_RightRun2.bmp"))
s_Player_Bitmap3 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_LeftRun1.bmp"))
s_Player_Bitmap4 = New System.Drawing.Bitmap( _
thisAssembly.GetManifestResourceStream(assemblyName _
+ ".Hank_LeftRun2.bmp"))
'Добавить изображения в коллекцию
s_colPlayerBitmaps = New System.Collections.ArrayList
s_colPlayerBitmaps.Add(s_Player_Bitmap1)
s_colPlayerBitmaps.Add(s_Player_Bitmap2)
s_colPlayerBitmaps.Add(s_Player_Bitmap3)
s_colPlayerBitmaps.Add(s_Player_Bitmap4)
'Возвратить коллекцию
Return s_colPlayerBitmaps
End Function
Private Shared s_blackPen As System.Drawing.Pen
Private Shared s_whitePen As System.Drawing.Pen
Private Shared s_ImageAttribute As _
System.Drawing.Imaging.ImageAttributes
Private Shared s_boldFont As System.Drawing.Font
'------------------------------------------------
'Вызывается для освобождения от любых графических
'ресурсов, которые могли быть кэшированы
'------------------------------------------------
Private Shared Sub g_CleanUpDrawingResources()
'Освободить память от черного пера, если таковое имеется
If Not (s_blackPenIs Nothing) Then
s_blackPen.Dispose()
s_blackPen = Nothing
End If
'Освободить память от белого пера, если таковое имеется
If Not (s_whitePenIs Nothing) Then
s_whitePen.Dispose()
s_whitePen = Nothing
End If
'Освободить память от атрибута ImageAttribute, если таковой имеется.
'Примечание. Метод Dispose() для этого типа не предусмотрен,
'поскольку все его данные являются управляемыми
If Not (s_ImageAttribute Is Nothing) Then
s_ImageAttribute = Nothing
End If
'Освободить память от полужирного шрифта, если таковой имеется
If Not (s_boldFontIs Nothing) Then
b_boldFont.Dispose()
s_boldFont = Nothing
End If
End Sub
'-----------------------------------------
'Эта функция позволяет получить доступ
'к черному перу, находящемуся в кэш-памяти
'-----------------------------------------
Private Shared Function g_GetBlackPen() As System.Drawing.Pen
'Если перо еще не существует, создать его
If (s_blackPen Is Nothing) Then
s_blackPen = New System.Drawing.Pen( _
System.Drawing.Color.Black)
End If
'Возвратить черное перо
Return s_blackPen
End Function
'----------------------------------------
'Эта функция позволяет получить доступ
'к белому перу, находящемуся в кэш-памяти
'----------------------------------------
Private Shared Function g_GetWhitePen() As System.Drawing.Pen
'Если перо еще не существует, создать его
If (s_whitePen Is Nothing) Then
s_whitePen = New System.Drawing.Pen( _
System.Drawing.Color.White)
End If
'Возвратить белое перо
Return s_whitePen
End Function
'-----------------------------------------------
'Эта функция позволяет получить доступ
'к полужирному шрифту, находящемуся в кэш-памяти
'-----------------------------------------------
Private Shared Function g_GetBoldFont() As System.Drawing.Font
'Если перо еще не существует, создать его
If (s_boldFont Is Nothing) Then
s_boldFont = New System.Drawing.Font( _
System.Drawing.FontFamily.GenericSerif, 10, System.Drawing.FontStyle.Bold)
End If
'Возвратить полужирный шрифт
Return s_boldFont
End Function
'-----------------------------------------------------
'Эта функция позволяет осуществлять доступ
'к находящемуся в кэш-памяти объекту imageAttributes,
'который мы используем для изображений с прозрачностью
'-----------------------------------------------------
Private Shared Function g_GetTransparencyImageAttribute() As _
System.Drawing.Imaging.ImageAttributes
'Если объект не существует, создать его
If (s_ImageAttributeIs Nothing) Then
'Создать атрибут изображения