Threadi

Mazliet par pavedieniem (threads) un VB.NET. Kopš .net CLR un CIL parādīšanās pavedieni vairs nav tikai "izvirtība priekš C++ programmētājiem" — tā ir arī ērti pieejama izvirtība VB programmētājiem.
Pirmkārt — kāpēc gan niekoties ar pavedieniem, ja viss tāpat jau darbojas? Viens no vienkāršākajiem pielietojumiem — ir vajadzīga aplikācija ar lietotāja interfeisu, kas paredzēta nepacietīgam cilvēkam, kuram neder, ka ineterfeiss "bremzē", bet ir nepieciešams veikt darbības, kuras aizņem daudz laika, kuras turklāt nav pārtraucamas. Piemēram, varam iedomāties aplikāciju, kas pār HTTP savienojumu ielādē ierakstus kādā listbox vai tamlīdzīgā kontrolē (kaut vai e-pasta vēstules, kas pa vienai parādās sarakstā). Kamēr dati lādējas, lietotājam varētu ļaut darīt arī kaut ko citu (piemēram, pakustināt formu).
Iedomājamies, ka ir nepieciešams ielādēt datus no HTTP, bet tajā laikā GUI jābūt brīvi pieejamam.
Datus varam dabūt ar šādu metodi

Public Function GetIt()
  Dim o As System.Net.HttpWebRequest
  o = System.Net.WebRequest.Create("http://www.asdf.lv/")
  Dim sText As String = New System.IO.StreamReader( _
    o.GetResponse.GetResponseStream()).ReadToEnd
  return sText
End Function
Skaidrs ir tas, ka šī metode izpildīsies "uzreiz", tātad, ja savienojums būs lēns, UI tajā laikā neatjaunosies.
Ko darīt. Izveidojam jaunu "darbinieka" klasi, kas veiks vajadzīgo darbu:
Public Class loader
  Public Event DataLoaded(ByVal result As String)
  Public Sub GetIt()
    Dim o As System.Net.HttpWebRequest
    o = System.Net.WebRequest.Create("http://www.asdf.lv/")
    Dim sText As String = New System.IO.StreamReader( _
    o.GetResponse.GetResponseStream()).ReadToEnd
    RaiseEvent DataLoaded(sText)
  End Sub
End Class
Šī klase definē arī savu notikumu (event) — DataLoaded. Notikums iestāsies tad, kad dati būs ielādēti. Notikums arī palīdzēs nogādāt ielādētos datus no izpildītāja pie "īpašnieka".
Ko darīt īpašniekam? Pieņemam, ka īpašnieks ir Windows forma, kurā nepieciešams ielādēt datus. Formai pirmkārt nepieciešama privāta izpildītāja klases instance.
Public WithEvents loaders As loader
Šo instanci nevaram deklarēt tās metodes ķermenī, kura izsauks strādātājpavedienu, jo mēs taču ceram, ka metode izsauks ielādes procedūru un turpinās darbu. Tātad, iespējams, beigsies pirms strādātājpavediena metodes.
Vēl nepieciešams deklarēt pašu pavedienu. To var izdarīt ar sekojošu rindu:
Public myThread As System.Threading.Thread
. Nu, kas tad vēl atliek… pavediena inicializācija un datu ķeršana. Šeit arī kopējais formas kods (izņemot kontroļu ģenerācijas kodu)
Public Class Forma
  Public WithEvents loaders As loader
  Public myThread As System.Threading.Thread
  Private Sub Button1Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click
    loaders = New loader()
    myThread = New System.Threading.Thread(AddressOf loaders.GetIt)
    myThread.Start() `sākas patiesā ielāde
  End Sub

  Private Sub loaders
a(ByVal result As String) _
     Handles loaders.DataLoaded
    Me.TextBox1.Text = result
  End Sub
End Class

Šeit arī redzams, ka, nospiežot pogu button1 tiek izveidota jauna pavediena instance, kurai tiek nodota izpildāmās metodes adrese. Šajā gadījumā tiek izmantota klases instances metode, bet tikpat labi metode varēja būt arī statiska.
Pēc tam pavediens tiek palaists darbā (un forma aizmirst par to, ka tas darbojas).
Vēlāk tiek apstrādāts notikums, ko radījusi ielādes klase – dati ir ielādēti.

FrontPage markup

Īss veids, kā tikt vaļā no FrontPage radītajām sliktajām lietām html kodā, ja “tāpat jau nāksies tam visam iet ar roku cauri”. Darām apmēram tā:

$dati=$_POST["dati"];
$dati=strip_tags($dati, "<a><b><i><p><br>");
$dati=preg_replace("/(class|style|align)=\"[^\"]+\"/i", "", $dati);

Tādējādi no formas (vai vienalga kādā veidā) saņemtais mainīgais $dati tiek iztīrīts un tālāk ir cilvēkam lietojams. Līdz ar to tekstā nedrīkst parādīties substringi kā class="kautkas", bet par to jau FrontPage parūpēsies, aizvietojot tos ar attiecīgiem html entities.

Tālāk nepārmantosim vis

Rakstot VB.Net (vai arī jebkurā citā citā OO programmēšanas valodā, izvēloties attiecīgus programmēšanas līdzekļus), ir vērts klasēm, par kuru “pareizību” neesi pilnībā pārliecināts, pievienot NotInheritable atslēgas vārdu. Tas nodrošinās to, ka klase nebūs mantojama. Savukārt citiem tavas klašu bibliotēkas lietotājiem būs vieglāk saprast, kuras klases ir izmantojamas par bāzes klasēm viņu aplikācijās.

OO debugging?

Objektorientētas programmēšanas īpatnība ir tā, ka debugošanas nolūkos ieliekot kodā rindiņu

echo “kuku”;
šis “kuku” parādīsies visneiespējamākajās vietās, par kurām tev pat prātā nebūs ienācis, ka arī tur debugojamā funkcija tiek izmantota.