За първи път, VB.NET дава възможността на VB разработчиците да пишат наистина апликации със свободна
последователност на нишките (
free threaded - следят нишката).Ако вашата апликация трябва да обработи големи
масиви от данни и това става бавно, вие можете да оставите тази обработка
свободно да се следи от програмата (
own thread - своя нишка), а останалата част от програмата да още
достъпна. Във VB6, най-доброто в такива случаи е да
се използва метод
DoEvents.
Изпробвайте следния код, написан за VB.NET. за бутон -
button4. Подпрограмата се нарича
BeBusy, има цикъл само за заемане на време.
Докато трае този цикъл (loop), вие консумирате нишката (
thread) за тази апликация, и UI няма да
отговори докато върви цикъла.
Внимание
Цикълът трае около десетина секунди, но ако ви се видят цяла
вечност можете да кликнете в VB.NET IDE и да изберете Stop Debugging от меню Debug.
Private Sub
button4_Click(ByVal sender As System.Object, _
ByVal e As
System.EventArgs) Handles button4.Click
BeBusy()
End Sub
Sub BeBusy()
Dim i As Decimal
For i = 1 To 10000000
`не се прави нищо
Next
Beep()
End Sub
За да създадете
thread,
трябва да използвате класа
System.
Threading. Thread. При създаването
на този клас, вие подавате името на процедурата или искания метод на този
thread. Префасонирайте името на
процедурата или метода с оператор AddressOf. Нещо такова:
Dim busyThread As New
System.Threading.Thread(AddressOf BeBusy)
Следващото, което трябва да направите е да извикате метод
Start на този нов
thread. Викането във
BeBusy (
VB.NET), на
своя собствен
thread ще
изглежда така:
Private Sub
button4_Click(ByVal sender As System.Object, _
ByVal e As
System.EventArgs) Handles button4.Click
Dim busyThread As New
System.Threading.Thread(AddressOf BeBusy)
busyThread.Start()
End Sub
Не се изискват промени в процедура
BeBusy. Ако стартирате този код, интерфейса ще остане активен докато върви
BeBusy. Кога е
приключила процедура
BeBusy ще
разберете от
Beep.
VB.NET поддържа свойство
IsAlive за всеки
thread, така че може да проверите кога върви.
-
Примери за наследяемост:
Пример 1 Сведения за служители (учители и администрация) в
едно училище
Фигура62Съобщителните
прозорци
Option
Strict On
Imports
System
Namespace slujashti
Public Class Slujasht
Private m_sFirstName As
String = ""
Private m_sLastName As
String = ""
Private m_bKvalifikacia As
Boolean = False
Private m_iSlujNumber As
Integer = 0
Private Shared
iTotslujashti As Integer
= 0
Sub New()
MyBase.New()
iTotslujashti
+= 1
m_iSlujNumber
= iTotslujashti
End Sub
Sub New(ByVal fName As String, ByVal lName As String)
MyBase.New()
m_sFirstName
= fName
m_sLastName =
lName
iTotslujashti
+= 1
m_iSlujNumber
= iTotslujashti
End Sub
Overridable Function
Serialize() As Boolean
If ((m_sFirstName <> "") And (m_sLastName <> "")) _
Then
Return
True
Else
Return False
End If
End Function
#Region "Slujasht
Properties"
Public ReadOnly Property SlujashtNumber() As
Integer
Get
Return m_iSlujNumber
End Get
End Property
Property FirstName() As
String
Get
FirstName
= m_sFirstName
End Get
Set(ByVal Value As String)
m_sFirstName = Value
End Set
End Property
Property LastName() As
String
Get
LastName
= m_sLastName
End Get
Set(ByVal Value As String)
m_sLastName = Value
End Set
End Property
Property
Kvalifikacia() As Boolean
Get
Kvalifikacia = m_bKvalifikacia
End Get
Set(ByVal Value As Boolean)
m_bKvalifikacia = Value
End Set
End Property
#End Region
End Class
End
Namespace
Imports
System
Imports
Slujasht.slujashti.Slujasht
Imports
Microsoft.VisualBasic.ControlChars
Imports
System.Windows.Forms
Namespace ShkolaDivision
`Отделенията (Divisions) са две - Администрация и Учители
Public Class Division
Inherits slujashti.Slujasht
Private m_sDivision As
String = ""
Private m_iMonthsInDivision As
Integer = 0
Sub New()
MyBase.New()
End Sub
Sub New(ByVal fName As String, ByVal lName As String)
MyBase.new((fName), (lName))
End Sub
Overrides Function
Serialize() As Boolean
If ((m_sDivision <> "") And _
(m_iMonthsInDivision
<> 0)) Then
If MyBase.Serialize =
True Then
Return True
Else
Return False
End If
Else
Return False
End If
End Function
#Region "Division
Properties"
Property Division() As
String
Get
Division
= m_sDivision
End Get
Set(ByVal Value As String)
m_sDivision = Value
End Set
End Property
Property MonthsInDivision() As
Integer
Get
MonthsInDivision = m_iMonthsInDivision
End Get
Set(ByVal Value As Integer)
m_iMonthsInDivision = Value
End Set
End Property
#End Region
End Class
End
Namespace
Public
Module modmain
'"Main" е началната точка на апликацията
Sub Main()
Dim newSluj1 As New ShkolaDivision.Division
Dim newSluj2 As New _
ShkolaDivision.Division("Mariya",
"Hristova")
With newSluj1
.FirstName =
"Jancho"
.LastName =
"Kudev"
.Division =
"Uchiteli"
.MonthsInDivision = 18
End With
showSlujasht(newSluj1)
newSluj2.Division
= "Administration"
newSluj2.MonthsInDivision = 7
If TypeOf newSluj2 Is _
ShkolaDivision.Division Then
If newSluj2.Serialize = True
Then
showSlujasht(newSluj2)
End If
End If
End Sub
'--Тази частна подпрограма ще поеме отделението - Division
'- class и ще разпечата съдържанието. Отбележете, че
'- сигнатурата показва, че подпрограмата приема
'- ShkolaDivision.Division тип данни за параметър
Private Sub
showSlujasht(ByRef currentSlujasht As _
ShkolaDivision.Division)
Dim sDisplayString As
String
sDisplayString =
"Slujasht Name: " & _
currentSlujasht.FirstName & _
" "
& currentSlujasht.LastName & CrLf
sDisplayString +=
"Slujasht Division: " & _
currentSlujasht.Division & CrLf
sDisplayString +=
"Slujasht Months: " & _
currentSlujasht.MonthsInDivision & CrLf
sDisplayString +=
"Slujasht Number: " & _
currentSlujasht.SlujashtNumber &
CrLf
MessageBox.Show(sDisplayString, "Slujasht Scanner", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End
Module