IntegrovanΘ prost°edφ rubriky Visual Basic

Autor: Jßn Hanßk

TΘma m∞sφce

Programovßnφ vφcevlßknov²ch aplikacφ

╚asovß nßroΦnost

(min):

65

ZaΦßteΦnφk

PokroΦil²

Profesionßl

Pou₧it² operaΦnφ systΘm : Hlavnφ v²vojov² nßstroj :

DalÜφ v²vojov² software :

Jin² software :

Windows 2000 SP3

Visual Basic .NET 2002

Äßdn²

Äßdn²

 

Nep°ehlΘdn∞te exkluzivnφ Specißl pro programßtory, kter² pojednßvß o jazykovΘ interoperabilit∞ mezi jazyky Managed Extensions for C++ a Visual Basic .NET.

 

Milφ Φtenß°i,

 

32bitovΘ prost°edφ operaΦnφho systΘmu Windows s sebou p°ineslo n∞kolik podstatn²ch a zßsadnφch zm∞n, a to nejen z u₧ivatelskΘho, n²br₧ i z programovacφho pohledu. Na p°ednφ p°φΦku v °eb°φΦku ätopô zm∞n se °adφ takΘ plnß podpora multitaskingu (paralelnφho zpracovßnφ v∞tÜφho mno₧stvφ ·loh) a multithreadingu (podpora exekuce vφcevlßknov²ch aplikacφ). Jak naprogramovat vφcevlßknovou aplikaci se dozvφte prßv∞ v tomto vydßnφ sekce TΘma m∞sφce.

 

Obsah

Teoretick² ·vod do problematiky proces∙ a vlßken

Vytvß°φme prvnφ vφcevlßknovou aplikaci

Testujeme prvnφ vφcevlßknovou aplikaci

Operace s vlßkny

 

 

Teoretick² ·vod do problematiky proces∙ a vlßken

 

Abychom mohli mluvit o programovßnφ vφcevlßknov²ch aplikacφ na pat°iΦnΘ ·rovni, musφme si nejprve pov∞d∞t pßr slov k ävφcevlßknovΘô terminologii. ZaΦneme od definice pojmu aplikace, kter² je vßm pravd∞podobn∞ nejbli₧Üφ. Aplikace je definovßna jako soubor programovΘho k≤du, dat a dalÜφch internφch nebo externφch zdroj∙, kterΘ spoleΦn∞ vytvß°ejφ jeden celek, jen₧ °eÜφ jistou smysluplnou ·lohu. Pojem aplikace se n∞kdy voln∞ zam∞≥uje s termφnem poΦφtaΦov² program.

 

I kdy₧ je ve v∞tÜin∞ p°φpad∙ tato substituce mo₧nß, nenφ zcela p°esnß. A to z toho d∙vodu, ₧e programem m∙₧e b²t takΘ jenom n∞kolik °ßdk∙ programovΘho k≤du, kterΘ aΦ °eÜφ jist² ·kol, nemusφ b²t nutn∞ samostatn²m celkem, jen₧ je p°edlo₧en p°ed u₧ivatele. M∙₧eme vÜak °φct, ₧e aplikace je ji₧ hotov², odlad∞nφ poΦφtaΦov² program, jen₧ se stßvß p°edm∞tem prodeje na softwarovΘm trhu.

 

V .NET prost°edφ je k≤d aplikace ulo₧en v jednΘ, nebo i n∞kolika assembly. Assembly je pak ulo₧ena v p°enositelnΘm spustitelnΘm souboru PE (Portable Executable). Jestli₧e je soubor aktivovßn (poklepßnφm na jeho ikonu), pot°ebn² programov² k≤d v podob∞ jazyka MSIL bude p°elo₧en JIT kompilßtorem, umφst∞n do pam∞ti poΦφtaΦe a podroben p°φmΘ exekuci. V tomto okam₧iku °φkßme, ₧e aplikace b∞₧φ. V programovßnφ se b∞₧φcφ aplikace oznaΦuje jako proces. Pro pot°eby procesu je alokovßn jist² pam∞¥ov² prostor, ve kterΘm se dan² proces nachßzφ. 32bitov² operaΦnφ systΘm Windows je, jak ji₧ bylo °eΦeno, pln∞ vybaven pro sprßvu vφce proces∙, resp. ·kol∙. Jak je to mo₧nΘ? Velmi zjednoduÜen∞ m∙₧eme prohlßsit, ₧e ka₧dΘmu procesu operaΦnφ systΘm p°iΦlenφ stanoven² Φasov² interval, v rßmci kterΘho je procesor (CPU) poΦφtaΦe pln∞ zam∞stnßn provßd∞nφm k≤du danΘho procesu. Po uplynutφ vymezenΘho intervalu se operaΦnφ systΘm äp°epneô do jinΘho procesu a jistou dobu vykonßvß k≤d tohoto procesu. Tφmto zp∙sobem operaΦnφ systΘm spravuje vÜechny procesy, neboli spuÜt∞nΘ aplikace. Je d∙le₧itΘ si uv∞domit, ₧e prßce s procesy je kompletn∞ v rukou operaΦnφho systΘmu, nikoliv jin²ch proces∙.

 

Ka₧d² proces je tvo°en p°inejmenÜφm jednφm vlßknem (thread). Vlßkno lze definovat jako samostatnou jednotku exekuce programovΘho k≤du procesu. Ka₧dΘ vlßkno mß svΘ identifikaΦnφ Φφslo (ID), jmΘno a prioritu. Zatφmco jmΘno vlßkna tvo°φ textov² °et∞zec, jen₧ slou₧φ na u₧ivatelskou identifikaci vlßkna, identifikaΦnφ Φφslo vlßkno p°esn∞ charakterizuje z pohledu operaΦnφho systΘmu. Priorita vlßkna urΦuje, jak intenzivn∞ je zapot°ebφ programov² k≤d danΘho vlßkna provßd∞t. ZvyΦejn∞ majφ vlßkna normßlnφ prioritu, avÜak v p°φpad∞ pot°eby je mo₧nΘ zv²Üit, nebo naopak snφ₧it prioritu vlßkna na p°φsluÜnou ·rove≥. Jestli₧e proces obsahuje jenom jedno vlßkno, mluvφme o jednovlßknovΘ aplikaci (single threaded application). Pokud jste vyvφjeli aplikace v p°edchozφ verzi Visual Basicu, nejspφÜ jste pracovali pouze s jednovlßknov²mi aplikacemi. Visual Basic .NET ovÜem nabφzφ programovßnφ takΘ vφcevlßknov²ch aplikacφ (multithreaded applications). Vφcevlßknovß aplikace je aplikace, kterß pou₧φvß dv∞ a vφce vlßken. Komparaci jedno a vφcevlßknovΘ aplikace m∙₧ete vid∞t na obr. 1.

 

 

Obr. 1 û Jedno a vφcevlßknovß aplikace

 

Vlßkno, kterΘ je na obrßzku pojmenovßno jako äVlßkno 1ô je zßkladnφm vlßknem procesu, co₧ znamenß, ₧e toto vlßkno je vytvo°eno implicitn∞ b∞hov²m prost°edφm aplikace. Naproti tomu vlßkno s nßzvem äVlßkno 2ô je pracovnφm vlßknem, kterΘ vytvo°il programßtor pro svΘ pot°eby. AΦkoliv obrßzek p°edstavuje jenom dvouvlßknovou aplikaci, proces m∙₧e obsahovat i v∞tÜφ mno₧stvφ vlßken. P°φliÜ mnoho vlßken ovÜem nenφ ₧ßdoucφ, proto₧e by snadno mohly nastat potφ₧e se synchronizacφ jednotliv²ch vlßken (pomineme-li pon∞kud v∞tÜφ pam∞¥ovou nßroΦnost aplikace). á

 

Ka₧dΘmu vlßknu v procesu je p°i°azen jist² Φasov² interval, b∞hem kterΘho CPU poΦφtaΦe realizuje programovΘ instrukce danΘho vlßkna. Jakmile tento interval uplyne, CPU okam₧it∞ zaΦne zpracovßvat k≤d dalÜφho vlßkna. Jeliko₧ je Φasov² interval realizace k≤du vlßkna velmi mal², vizußln∞ to vypadß, jakoby ob∞ vlßkna pracovala souΦasn∞.á

 

 

Vytvß°φme prvnφ vφcevlßknovou aplikaci

 

V nßsledujφcφ programovΘ ukßzce si p°edvedeme, jak sestrojit jednoduchou dvouvlßknovou aplikaci. Postupujte podle nφ₧e uveden²ch instrukcφ:

 

  1. Spus¥te Visual Basic .NET a vytvo°te standardnφ aplikace pro Windows (Windows Application).

 

  1. Na formulß° p°idejte jednu instanci ovlßdacφho prvku Button, kterou pojmenujte jako btnVytvo°it_vlßkno (libovoln∞ m∙₧ete takΘ modifikovat vlastnost Text vytvo°enΘ instance). Na vytvo°enou instanci poklepejte, Φφm₧ na°φdφte Visual Basicu, aby vygeneroval kostru udßlostnφ procedury Click instance. Do obslu₧nΘ procedury zadejte tento programov² k≤d:

 

ááááááá Dim NovΘVlßkno As New Threading.Thread(AddressOf Metoda)

ááááááá NovΘVlßkno.Name = "MojeVlßkno"

ááááááá NovΘVlßkno.Start()

 

Poka₧dΘ, kdy₧ budeme chtφt vytvo°it novΘ vlßkno, pou₧ijeme t°φdu Thread z jmennΘho prostoru System.Threading. Z tohoto pohledu je tedy z°ejmΘ, ₧e k vytvo°enΘmu vlßknu budeme ve skuteΦnosti p°istupovat prost°ednictvφm instance t°φdy Thread. Instance tΘto t°φdy se ovÜem rodφ pon∞kud zvlßÜtnφm zp∙sobem. Podφvejme se na n∞j blφ₧e. P°edevÜφm je zapot°ebφ obslou₧it parametrick² konstruktor t°φdy Thread, kterΘmu je nutno p°edat (pomocφ operßtoru AddressOf) runtime adresu procedury, kterß bude provßd∞na na nov∞ vytvo°enΘm vlßkn∞. Ve skuteΦnosti je vÜak cel² proces pon∞kud komplikovan∞jÜφ: AΦkoliv je tato skuteΦnost zastφn∞na, je vytvo°en delegßt ThreadStart, jemu₧ je sv∞°ena runtime adresa spouÜt∞cφ procedury. I kdy₧ vytvo°φme novΘ vlßkno (resp. instanci t°φdy Thread), neznamenß to jeÜt∞, ₧e jsme takΘ toto vlßkno spustili.

 

V tΘto souvislosti je nutno podotknout, ₧e p°i prßci s vlßkny je zapot°ebφ d∙sledn∞ rozliÜovat dva pojmy, a sice vytvo°enφ vlßkna a jeho spuÜt∞nφ. Vlßkno je vytvo°eno jakmile je zrozena instance t°φdy Thread. Takto vytvo°enΘ vlßkno mß p°φznak Unstarted, co₧ znamenß, ₧e jeÜt∞ nebylo spuÜt∞no. Aby mohlo b²t vlßkno spuÜt∞no, musφ b²t zavolßna metoda Start instance t°φdy Thread. áá

 

SpuÜt∞nφ novΘho vlßkna zabezpeΦφme zavolßnφm metody Start instance t°φdy Thread. Jakmile je aktivovßna metoda Start, je zavolßna spouÜt∞cφ procedura, kterß bude provßd∞na na novΘm vlßkn∞. Proces tvorby a spuÜt∞nφ novΘho vlßkna je znßzorn∞n na obr. 2.

 

 

Obr. 2 û Proces vytvo°enφ a spuÜt∞nφ vlßkna

 

Pro zvφdavΘ programßtory: Vytvo°enφ instance t°φdy Thread pod drobnohledem

 

JeÜt∞ jednou se podφvejme na v²Üe uveden² zdrojov² k≤d pro vytvo°enφ instance t°φdy Thread:

 

ááááááá Dim NovΘVlßkno As New Threading.Thread(AddressOf Metoda)

ááááááá NovΘVlßkno.Name = "MojeVlßkno"

ááááááá NovΘVlßkno.Start()

 

I kdy₧ je tento k≤d zcela sprßvn², nenφ v n∞m vid∞t role delegßta ThreadStart. Obm∞nφme-li k≤d nßsledovn∞, vyjdou skrytΘ skuteΦnosti na povrch:

 

ááááááá Dim NovΘVlßkno As New Threading.Thread _

ááááááá (New Threading.ThreadStart(AddressOf Metoda))

ááááááá NovΘVlßkno.Name = "MojeVlßkno"

áááááá áNovΘVlßkno.Start()

 

Tento k≤d jasn∞ demonstruje zp∙sob, pomocφ n∞ho₧ je instanci t°φdy Thread p°edßn delegßt ThreadState, kterΘmu je prost°ednictvφm operßtoru AddressOf poskytnuta runtime adresa spouÜt∞cφ procedury (s nßzvem Metoda), kterß bude realizovßna na nov∞ vytvo°enΘm vlßkn∞. AΦkoliv je tento zßpis k≤du pro vytvo°enφ vlßkna znateln∞ delÜφ, umo₧≥uje nßm pohled do zßkulisφ procesu vytvß°enφ vlßkna. V mnoha programech jej vÜak zcela jist∞ neuvidφte, proto₧e Visual Basic p°idßvß uvedenΘ rozÜφ°enφ k≤du implicitn∞, a tedy nenφ nutnΘ, abyste tuto äprodlou₧enouô verzi k≤du pou₧φvali ve sv²ch aplikacφch.

 

 

V naÜem p°φpad∞ je vytvo°ena instance t°φdy Thread s nßzvem NovΘVlßkno. Konstruktoru t°φdy je p°edßna adresa procedury Metoda, tato procedura se tedy bude provßd∞t na druhΘm (vytvo°enΘm) vlßkn∞. JeÜt∞ p°edtφm, ne₧ je vlßkno spuÜt∞no, je upravena vlastnost Name instance MojeVlßkno û novΘ vlßkno tak bude disponovat u₧ivatelsky p°φv∞tiv²m jmΘnem.

 

  1. Jestli₧e jste udßlostnφ proceduru Click instance tlaΦφtka vyplnili uveden²m zdrojov²m k≤dem, obdr₧eli jste zcela jist∞ p°ipomφnku, ₧e procedura Metoda nenφ deklarovßna. Proto je nutnΘ k≤d tΘto procedury zahrnout do k≤du t°φdy formulß°e Form1. Proto₧e ukßzkovß procedura Metoda vyu₧φvß referenΦnφ prom∞nnΘ a konstanty s oborem t°φdy, je uveden v²pis kompletnφho programovΘho k≤du, jen₧ se nachßzφ v souboru Form1.vb:

 

Option Strict On

Public Class Form1

ááá Inherits System.Windows.Forms.Form

 

á ááDim frm As Form

ááá Dim lblText1 As Label

ááá Dim lbltext2 As Label

ááá Dim Progres As ProgressBar

 

ááá Const PROGRES_MIN As Integer = 1

ááá Const PROGRES_MAX As Integer = 1000

 

ááá Private Sub Button1_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles Button1.Click

ááááááá Dim NovΘVlßkno As New Threading.Thread(AddressOf Metoda)

ááááááá NovΘVlßkno.Name = "MojeVlßkno"

ááááááá NovΘVlßkno.Start()

ááá End Sub

 

ááá Private Sub Metoda()

ááááááá frm = New Form()

ááááááá lblText1 = New Label()

ááááááá lbltext2 = New Label()

ááááááá Progres = New ProgressBar()

ááááááá With frm

ááááááááááá .ControlBox = False

ááááááááááá .FormBorderStyle = FormBorderStyle.FixedDialog

ááááááááááá .Text = "Probφhß v²poΦet nßhodn²ch Φφsel..."

ááááááá End With

 

ááááááá With lblText1

ááááááááááá .Location = New Point(0, 0)

ááááááááááá .Size = New Size(frm.Width, frm.Height \ 4)

ááááááááááá .Text = "Prßv∞ probφhß generovßnφ nßhodn²ch Φφsel"

ááááááááááá .Font = New Font("Verdana", 18, FontStyle.Bold, _

ááááááá ááááGraphicsUnit.Pixel)

ááááááááááá .TextAlign = ContentAlignment.MiddleCenter

ááááááá End With

 

ááááááá With lbltext2

ááááááááááá .Location = New Point(0, 75)

ááááááááááá .Size = New Size(frm.Width, frm.Height \ 6)

ááááááááááá lbltext2.Text = "╚φseln² pr∙beh generovßnφ Φφsel:"

ááááááááááá .Font = New Font("Verdana", 11, FontStyle.Bold, _

ááááááááááá GraphicsUnit.Pixel)

ááááááááááá .TextAlign = ContentAlignment.MiddleCenter

ááááááá End With

 

ááááááá With Progres

ááááááááááá .Dock = DockStyle.Bottom

ááááááá áááá.Height = frm.Height \ 6

ááááááááááá .Minimum = PROGRES_MIN

ááááááááááá .Maximum = PROGRES_MAX

ááááááá End With

 

ááááááá With frm.Controls

ááááááááááá .Add(Progres)

ááááááááááá .Add(lblText1)

ááááááááááá .Add(lbltext2)

ááááááá End With

 

 

ááááááá AddHandler frm.Load, AddressOf frm_Load

ááááááá frm.Show()

 

ááááááá Dim f As Integer = FreeFile()

ááááááá Randomize()

ááááááá Dim a, x As Integer

ááááááá FileOpen(f, "d:\data.txt", OpenMode.Output)

ááááááá For a = PROGRES_MIN To PROGRES_MAX

ááááááááááá x = CInt(Int(1000 * Rnd()) + 1))

ááááááááááá Progres.Value = a

ááááááááááá lbltext2.Text = a & " / " & PROGRES_MAX

ááááááááááá If a < PROGRES_MAX Then

ááááááááááááááá Print(f, x & ", ")

ááááááááááá Else

ááááááááááááááá Print(f, x & ".")

ááááááááááá End If

áááááááá áááApplication.DoEvents()

ááááááá Next a

ááááááá FileClose(f)

ááááááá frm.Close()

 

ááá End Sub

 

ááá Private Sub frm_Load(ByVal sender As Object, ByVal e As EventArgs)

ááááááá frm.Top = (Screen.PrimaryScreen.Bounds.Height - frm.Height) \ 2

ááááááá frm.Left = (Screen.PrimaryScreen.Bounds.Width - frm.Width) \ 2

ááá End Sub

End Class

 

Na vytvo°enΘm vlßkn∞ bude provßd∞n k≤d procedury Metoda, kter² realizuje nßsledujφcφ Φinnosti:

 

 

 

Testujeme prvnφ vφcevlßknovou aplikaci

 

Jste-li s programovßnφm hotovi, m∙₧ete aplikaci sestavit (Build è Build Solution). Jestli₧e aplikaci spustφte, uvidφte, ₧e svoji prßce odvßdφ skv∞le (obr. 2).

 

 

Obr. 2 û Vφcevlßknovß aplikace v akci

 

Jak se ovÜem dovφme, ₧e generovßnφ nßhodn²ch Φφsel, jako i dalÜφ k≤d, jen₧ je ulo₧en v procedu°e Metoda skuteΦn∞ b∞₧φ na nov∞ vytvo°enΘm vlßkn∞? Inu, asi takto:

 

  1. Pokud se vßÜ projekt jeÜt∞ nachßzφ v re₧imu b∞hu, tak uzav°ete dialogovΘ okno aplikace, Φφm₧ se dostanete do re₧imu nßvrhu.
  2. V programovΘm k≤du t°φdy Form1 vyhledejte zaΦßtek procedury Metoda.
  3. Abychom vid∞li, zdali je ji₧ vytvo°enΘ novΘ vlßkno, umφstφme na zaΦßtek procedury Metoda programovou zarß₧ku (breakpoint). To ud∞lßte tak, ₧e nalevo od nßzvu procedury klepnete na plochu ÜedΘho panelu (obr. 3).

 

 

Obr. 3 û Vlo₧enφ zarß₧ky do programovΘho k≤du

 

O sprßvnosti umφst∞nφ zarß₧ky vßs ujistφ Φerven² puntφk, jen₧ se objevφ v levΘm panelu. Krom∞ ΦervenΘho puntφku si m∙₧ete takΘ vÜimnout Φerven² pruh, kter²m je zv²razn∞n °ßdek programovΘho k≤du, na n∞m₧ je zarß₧ka umφst∞nß.

 

Jestli₧e na n∞jak² °ßdek programovΘho k≤du umφstφme zarß₧ku, dßme tφm debuggeru Visual Basicu p°φkaz, aby p°i p°echodu na °ßdek se zarß₧kou zastavil b∞h aplikace a zp°φstupnil dodateΦnΘ mo₧nosti pro odla∩ovßnφ k≤du aplikace.á

 

Za°azenφ programovΘ zarß₧ky je v²hodnΘ p°edevÜφm proto, ₧e jakmile debugger Visual Basicu äskoΦφô na °ßdek se zarß₧kou, bude b∞h aplikace pozastaven a my budeme moci prozkoumat vnit°nφ programovΘ jßdro aplikace. Pozastavenou aplikaci lze samoz°ejm∞ dßle rozb∞hnout, nebo ji m∙₧ete ukonΦit.

 

  1. Spus¥te aplikaci a klepn∞te na tlaΦφtko pro vytvo°enφ novΘho vlßkna. B∞h aplikace se zastavφ a vy budete p°eneseni do re₧imu odla∩ovßnφ aplikace.
  2. Seznam vlßken je uveden v dialogu Threads. Pokud tento dialog nevidφte, vyberte nabφdku Debug, uka₧te na subnabφdku Windows a klepn∞te na polo₧ku Threads. Zobrazφ se dialog Threads, v n∞m₧ jsou uvedena vÜechna aktivovanß vlßkna (obr. 4). á

 

DialogovΘ okno Threads m∙₧ete zobrazit takΘ pomocφ klßvesovΘ zkratky CTRL+ALT+H.

 

 

Obr. 4 û DialogovΘ okno Threads

 

  1. VÜimn∞te si, ₧e v okam₧iku p°eruÜenφ b∞hu aplikace ji₧ bylo vytvo°eno novΘ vlßkno. Toto vlßkno mß nßzev MojeVlßkno, identifikaΦnφ Φφslo 1324 a normßlnφ prioritu.
  2. Pokud chcete, aby aplikace pokraΦovala v b∞hu, vyberte nabφdku Debug a klepn∞te na polo₧ku Continue. V opaΦnΘm p°φpad∞ m∙₧ete zvolit p°φkaz Stop Debugging (rovn∞₧ z nabφdky Debug).
  3. Vytvo°enou programovou zarß₧ku odstranφte klepnutφm na Φervenφ puntφk v levΘm panelu.

 

 

Operace s vlßkny

 

Jakmile je vlßkno vytvo°eno, m∙₧ete s nφm provßd∞t n∞kolik operacφ. Rßmec potencißlnφch akcφ pro prßci s vlßkny zast°eÜuje t°φda Thread se sv²mi Φlensk²mi metodami a vlastnostmi. V nßsledujφcφ tabulce se nachßzφ p°ehled n∞kter²ch klφΦov²ch metod a vlastnostφ pro prßci s vlßkny, o nich₧ si myslφm, ₧e by mohly b²t pro vßs u₧iteΦnΘ.

 

Nßzev

Typ Φlenu

Charakteristika

Abort

Metoda

Metoda se pou₧φvß pro zruÜenφ vlßkna. Po zavolßnφ metody je ve vybranΘm vlßknu generovßna v²jimka ThreadAbortException, naco₧ je spuÜt∞n proces ruÜenφ vlßkna.

CurrentThread

Vlastnost

Jde o sdφlenou (shared) vlastnost, co₧ znamenß, ₧e jde o vlastnost samotnΘ t°φdy Thread a nikoliv instance tΘto t°φdy. Pou₧ijete-li tuto vlastnost, zφskßte p°φstup k vlßknu, jeho₧ programov² k≤d je prßv∞ provßd∞n.á

Name

Vlastnost

Pokud chcete vlßkno pojmenovat, p°φpadn∞ chcete-li jmΘno vlßkna zφskat, m∙₧ete pou₧φt tuto vlastnost. Hodnotou vlastnosti je textov² °et∞zec, jen₧ p°edstavuje u₧ivatelskΘ jmΘno pro po₧adovanΘ vlßkno.

Priority

Vlastnost

Vlastnost urΦuje prioritu vlßkna. Ka₧dΘ vlßkno se m∙₧e nachßzet v n∞kolika prioritnφch stavech:

          Highest (NejvyÜÜφ priorita)

          AboveNormal (VyÜÜφ ne₧li normßlnφ priorita)

          Normal (Standardnφ priorita)

          BelowNormal (Ni₧Üφ ne₧li normßlnφ priorita)

          Lowest (Nejni₧Üφ priorita)

Hodnotou vlastnosti je jeden z Φlen∙ enumerace ThreadPriority (AboveNormal, BelowNormal, Highest, Lowest, Normal).

ResetAbort

Metoda

Jde o sdφlenou (shared) metodu, kterß likviduje po₧adavek na zruÜenφ (Abort) vlßkna.

Resume

Metoda

Metodu lze aplikovat na vlßkno, kterΘ bylo uvedeno do stavu neΦinnosti pou₧itφm metody Suspend. Metoda zabezpeΦφ probuzenφ vlßkna a exekuci jeho programovΘho k≤du.á

Sleep

Metoda

Jde o sdφlenou (shared) a takΘ p°etφ₧enou metodu, kterß se vyskytuje ve dvou exemplß°φch. Ob∞ p°etφ₧enΘ varianty metody zamezφ provßd∞nφ programovΘho k≤du aktivnφho vlßkna na urΦit² Φasov² interval (tento je zvyΦejn∞ m∞°en v milisekundßch).áááá

Start

Metoda

Zavolßnφ metody zp∙sobφ rozb∞hnutφ programovΘho k≤du na danΘm vlßkn∞. Vlßknu, resp. instanci t°φdy Thread, je po aktivaci metody Start p°i°azen stav ThreadState.Running, co₧ znamenß, ₧e vlßkno je aktivnφ (je realizovßn k≤d vlßkna). Jestli₧e bylo vlßkno jednou ukonΦeno, nelze jej op∞t aktivovat prost°ednictvφm op∞tovnΘho volßnφ metody Start.áá

Suspend

Metoda

Metoda Suspend je podobn∞ jako metoda Sleep pou₧φvanß na äuvedenφ vlßkna do stavu spßnkuô. Mezi t∞mito dv∞ma metodami ovÜem existuje n∞kolik podstatn²ch rozdφl∙. P°edevÜφm, metoda Sleep je sdφlenß (shared), co₧ znamenß, ₧e ji mo₧no aplikovat jenom na vlßkno, jeho₧ programov² k≤d se prßv∞ uskuteΦ≥uje. Metoda Suspend je naproti tomu metodou instance a nikoliv t°φdy, z Φeho₧ vypl²vß, ₧e tuto metodu m∙₧ete pou₧φt na jakoukoliv instanci t°φdy Thread. Druh²m odliÜn²m znakem je skuteΦnost, ₧e jestli₧e je pou₧ita metoda Sleep, je p°edem definovan² Φasov² interval (v milisekundßch), v rßmci n∞ho₧ bude vlßkno spßt. Na druhΘ stran∞, bude-li zavolßna metoda Suspend, nelze p°edem urΦit, kdy mß dojφt k uspßnφ vlßkna. Ve skuteΦnosti dochßzφ k uspßnφ vlßkna v okam₧iku, kdy je dosa₧en tzv. bezpeΦn² bod. UrΦenφ existence bezpeΦnΘho bodu mß na starosti Common Language Runtime (CLR) pomocφ slu₧by Garbage Collection. A koneΦn∞, poslednφ odliÜnost spoΦφvß v op∞tovnΘ aktivaci deaktivovanΘho vlßkna. Bude-li vlßkno uspßno pomocφ metody Suspend, lze jej ihned probudit zavolßnφm metody Resume. Uspφte-li vÜak vlßkno metodou Sleep, neexistuje ₧ßdn² zp∙sob, jak jej probudit p°edtφm, ne₧li vyprÜφ stanovenß doba vlßkna pro neΦinnost.

ThreadState

Vlastnost

Ka₧dΘ vlßkno se m∙₧e nachßzet v urΦitΘm poΦtu stav∙. SkuteΦnosti o stavu vlßkna zprost°edkovßvß prßv∞ vlastnost ThreadState. Jde o vlastnost pouze pro Φtenφ, co₧ znamenß, ₧e hodnotu vlastnosti lze p°eΦφst, ovÜem nenφ mo₧nΘ ji jakkoliv modifikovat (toto chovßnφ je vzhledem k charakteru vlßken snadno pochopitelnΘ). Hodnotou vlastnosti je jeden z Φlen∙ enumerace ThreadState.ááá

á

Tab. 1 û Charakteristika u₧iteΦn²ch vlastnostφ a metod t°φdy Thread

 

 

Prßv∞ jste doΦetli TΘma m∞sφce.á

 

Jestli₧e se chcete dozv∞d∞t vφce informacφ o programovßnφ ve Visual Basicu .NET, nevßhejte a navÜtivte takΘ dalÜφ sekce rubriky Visual Basic. A jakß₧e je dneÜnφ nabφdka?

Serißl ZaΦφnßme s VB .NET

Klasifikace operßtor∙, aritmetickΘ a porovnßvacφ operßtory.

Programßtorskß laborato°

Tvorba zapeΦet∞nΘ t°φdy

P°φstup k registr∙m operaΦnφho systΘmu Windows

Vytvß°enφ vlastnφho delegßta

 

Nep°ehlΘdn∞te exkluzivnφ Specißl pro programßtory, kter² pojednßvß o jazykovΘ interoperabilit∞ mezi jazyky Managed Extensions for C++ a Visual Basic .NET.