Sunteți pe pagina 1din 46

Programare Visual Studio .

NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Programare $icroso%t
Visual Studio .#&'
Lucrari de laborator
Version no.: 1 Page 1 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Cuprins
1 INTRODUCERE......................................................................................................................................................4
2 PREZENTAREA MEDIULUI DE PROGRAMARE VISUAL STUDIO .NET.................................................5
2.1 PRINCIPALELE FERESTRE DE LUCRU DIN VISUAL STUDIO...................................................................................7
2.2 COMENZILE DE LUCRU UTILIZATE IN VS............................................................................................................7
3 DEFINIREA CLASELOR IN OOP........................................................................................................................9
3.1 PROPRIETATI, CONSTRUCTORI. TIPUL ENUM SI DATETIME.................................................................................9
3.2 INSTANTIEREA CLASELOR.................................................................................................................................10
3.3 CONSTRUCTORI PRIVATI. OBIECTELE TIMER SI RANDOM.................................................................................11
4 PREZENTAREA DATELOR................................................................................................................................15
4.1 SOLUTII CU PROIECTE MULTIPLE. IERARHIZAREA PROIECTELOR......................................................................15
4.2 FEREASTRA OUTPUT.........................................................................................................................................16
4.3 PRORAMARE BAZATA PE EVENIMENTE. OBIECTELE !DELEATE! SI !EVENT!...............................................17
4.4 PREZENTAREA DATELOR IN DATARID.............................................................................................................19
4.4.1 Controalele de tip GUI nu sunt thread-safe.............................................................................................21
4.5 CONTROALE VIZUALE" CHEC#BO$, TE$TBO$. CLASA DICTIONAR%..............................................................23
5 SALVAREA INFORMATIILOR IN BAZA DE DATE.......................................................................................30
5.1 CREAREA BAZEI DE DATE S&LITE....................................................................................................................30
5.2 DATA AC&UISITION LA%ER " INTERFATA INTRE BAZA DE DATE SI APLICATIA UI...........................................31
5.2.1 Definirea string-ului de conectare la baza de date in pagina de proprietati a proiectului.....................32
5.3 CLASA DE INTERFATA CU BAZA DE DATE..........................................................................................................33
5.3.1 al!area infor"atiilor in baza de date.....................................................................................................33
5.3.2 Citirea infor"atiilor din baza de date......................................................................................................3#
6 TRANSMITEREA DATELOR INTRE APLICATII. SOCKET TCP/IP.........................................................40
6.1 OBIECTUL TCPCOMMCLIENT...........................................................................................................................41
#.1.1 I"pachetarea datelor pentru trans"isie..................................................................................................42
#.1.2 Crearea unui nou fir de e$ecutie pentru fiecare dialog cu ser!erul........................................................43
#.1.3 %ri"iterea datelor catre ser!er................................................................................................................44
#.1.4 &unctia Dispose inchide firele de e$ecutie suspendate............................................................................45
6.2 OBICETUL TCPCOMMSERVER..........................................................................................................................46
Version no.: 1 Page 2 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Lista de iguri
Figura 1: Visual Studio a*are ca de+en+.e,e in lista de *rocese din 'as- $anager........................................
Figura 2: Crearea unui nou *roiect de ti* /Console **lication/ in Visual Studio .#&'..................................)
Figura 0: Princi*alele %erestre de lucru ale mediului Visual Studio..................................................................1
Figura (: Clasa /Sensor2ase/ si enumerarea /Sensor'3*e/.......................................................................... 4
Figura .: Constructorii clasei Sensor2ase.................................................................................................... 10
Figura ): Selectarea unei +alori dintr-o enumerare....................................................................................... 10
Figura 1: 5nstantierea clasei /Sensor2ase/ %olosind constructorul im*licit.....................................................11
Figura 8: Constructorii clasei Pum*SensorValues........................................................................................ 12
Figura 4: Functia de generare si a%isare a +alorile aleatoare *entru sen6ori.................................................10
Figura 10: 5ntantierea clasei /Pum*SensorValues/ si *ornirea ceasului.......................................................10
Figura 11: Selectarea unui *roiect ca re%erinta *entru *roiectul curent.........................................................1.
Figura 12: "ansarea in e,ecutie a %unctiei de simulare a sen6orilor..............................................................1)
Figura 10: Fereastra 7ut*ut a%isea6a mesajele trimise la consola................................................................1)
Figura 1(: atasarea %unctiei /b'est8Clic-/ la e+enimentul /b'est.Clic-/........................................................11
Figura 1.: De%inirea obiectelor de ti* delegate si e+ent in clasa de generare a datelor de masurare...........11
Figura 1): "ansarea e+enimentului /ne9SensorValue&+ent/.......................................................................18
Figura 11:tasarea %unctiei /7n#e9SensorValue:andler/ la e+enimentul /ne9SensorValue&+ent/............18
Figura 18:Valorile *rimite *rin e+eniment de la clasa /Pum*SensorValue/ sunt a%isate in $essage2o,......14
Figura 14: Controlul Data;ridVie9 din 'ool2o,............................................................................................ 14
Figura 20:Setarea sursei de date *entru gridul de a%isare............................................................................ 20
Figura 21: Po*ularea listei sensorValue"ist si setarea ei ca DataSource *entru grid...................................21
Figura 22: &roare: un alt t!read accesea6a datagridul.................................................................................21
Figura 20: Fereastra *rinci*ala de *re6entare a datelor cu datagrid-ul legat la lista de +alori......................20
Figura 2(: daugarea codului de *acient in clasa cu +alorile sen6orilor.......................................................2(
Figura 2.: Patient code trebuie adaugat si in clasa Pum*SensorValues......................................................2(
Figura 2): &+enimentul /ne9SensorValue&+ent/ include si codul de *acient...............................................2(
Figura 21: daugarea coloanei PatientCode in datagrid............................................................................... 2.
Figura 28: Fereastra DataPresentation cu butoanele de startare si o*rire a monitori6arii............................2.
Figura 24: &numerarea ce include codurile de *acienti................................................................................ 2)
Figura 00: tasarea unei enumerari la un C!ec-2o,.................................................................................... 2)
Figura 01: Codul a%erent butonului /Start $onitoring/................................................................................... 2)
Figura 02: Functia StartPum*ing cu *arametrii cod *acient si *erioada de tim*..........................................21
Figura 00: 7*rirea monitori6arii *entru un *acient si eliminarea lui din dictionarul *acientilor acti+i.............28
Figura 0(: Crearea ba6ei de date <PatientData= in S>"ite dministrator......................................................00
Figura 0.: Crearea tabelului <PatientData= *entru sal+area datelor ce +in de la *acienti..............................01
Figura 0): daugarea *roiectului <DataStore= de ti* <Class "ibrar3= la solutie..............................................02
Figura 01: De%inirea string-ului de conectare la ba6a de date S>"ite in *agina de *ro*rietati a *roiectului. 00
Figura 08: Functia de inserare a unei +alori de masurare in ba6a de date...................................................0(
Figura 04: 'ratarea e+enimentului <ne9SensorValue&+ent=: sal+are in ba6a si a%isare in datagrid..............0.
Figura (0: Comanda S>" de +i6uali6are a datelor din tabela PatientData...................................................0.
Figura (1: Vi6uali6area datelor din ba6a in S>"ite dministrator.................................................................0.
Figura (2: Fereastra DataPresentation du*a ce s-a adaugat sectiunea de %iltrare......................................0)
Figura (0: Functia de citire din ba6a de date a datelor de masurare *entru un *acient si o 6i stabilita........01
Figura ((: Proiectul <CommonRe%erences= contine toate de%initiile *articulare ale ti*urilor de date.............08
Figura (.: %isarea +alorilor din ba6a de date............................................................................................... 04
Figura (): Functia !andler *entru butonul <Dis*la3 Recei+ed Data=.............................................................04
Version no.: 1 Page 0 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
! "ntroducere
Sco*ul lucrarilor de laborator *re6entate in acest document este de %amiliari6a studentul cu mediul de
*rogramare Visual Studio .#&' si a*licarea *ractica a cunostintelor *re6entate la curs.
5n acest sco*? se *ro*une in cele ce urmea6a reali6area unei minia*licatii numite /:ealt!$onitor/ care sa
monitori6e6e de la distanta starea unui *acient cu *robleme de sanatate? in sensul ca *acientul *oate sa
ramana acasa *urtand cu el di+ersi sen6ori de masurare a bio-*arametrilor @tem*eratura? ritm cardiac?
glicemie? etcA si aceste +alori sunt trimise *rin internet la cabinetul doctorului care urmareste ast%el starea
*acientului si se de*lasea6a numai la a*aritia unei alarme.
Ce *resu*une aceasta monitori6areB
Citirea *arametrilor bio
Sal+area +alorilor masurate intr-o ba6a de date locala
'ransmisia +alorilor la a*licatia ce rulea6a in cabinetul doctorului
%isarea acestor +alori sub %orma gra%ica sau te,t *entru ca doctorul sa *oata trage conclu6iile
corecte re%eritoare la starea de sanatate a *acientului
Prin im*lementarea acestor tas-uri? studentul +a trebui sa-si insuseasca si sa lucre6e cu urmatoarele
conce*te:
De%inirea claselor in 77P
5nstantierea claselor
$ostenire
Controale gra%ice
Sal+area datelor in ba6a de date
Comunicatii 'CPC5P
$ultit!reading
Programare ba6ata *e e+enimente
...
&+ident ca aceste conce*te nu *ot %i aco*erite in totalitate intr-un numar atat de mic de ore? dar acest
e,em*lu *oate re*re6enta un *unct de *lecare *entru de6+oltarea de alte a*licatii serioase si a*ro%undarea
cunostintelor legate de *rogramare obiect si Visual Studio .#&'.
Version no.: 1 Page ( o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
# Pre$entarea mediului de programare Visual Studio .NET
$ediul Visual Studio se desc!ide *rin lansarea in e,ecutie a *rogramului /C:DProgram FilesD$icroso%t Visual
Studio 4.0DCommon1D5D&Dde+en+.e,e/. 'rebuie retinut numele *rogramului /de+en+.e,e/ deoarece de multe
ori este utila sa desc!idem a*licatia /'as- $anager/ din Eindo9s si sa anali6am modul de ocu*are a
memoriei si a micro*rocesorului in tim*ul rularii unui *rogram. Fa*tul ca a*are /de+en+.e,e/ in ca*ul listei
din tab-ul /Processes/ cu o *ortiune mare de memorie utili6ata? inseamna de multe ori ca *rogramul a
ramas agatat *e un %ir de e,ecutie in%init si trebuie o*rit din 'as-$anager.
%igura !& Visual Studio apare ca de'en'.e(e in lista de procese din Tas) *anager
Du*a lansarea VS? *rimul *as este de a desc!ide un *roiect deja e,istent *e dicul local? sau *utem crea un
nou *roiect @meniul FileC#e9CProject../A
Version no.: 1 Page . o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura #& Crearea unui nou proiect de tip +Console Application+ in Visual Studio .NET
Putem alege din mai multe ti*uri de *roiecte? du*a cum urmea6a:
Eindo9s Form a**lication: este *entru de6+oltarea de a*licatii de ti* ;F5? ba6ate *e %erestre?
controale gra%ice? etc.
EPF **lication: de6+olta acelasi ti* de a*licatii de ti* ;F5? dar ba6ate *e noua te!nologie EPF
@Eindo9s Presentation FoundationA ce e,*une *osibilitati mult mai largi de desenare gra%ica a
inter%etelor utili6ator. EPF lucrea6a cu limbajul G$" *rin care se *ot descrie imagine gra%ice de *e
ecran. Folosind acest limbaj? utili6atorul are *osibilitatea sa desene6e inter%ata gra%ica intr-o
a*licatie s*eci%ica de desenare? e,*orta imaginea in %ormat G$" si aceasta se im*orta in Visual
Studio unde i se *oate atasa e+enimente si logica necesara a*licatiei.
Console **lication: cel mai sim*lu *roiect? nu are inter%ata gra%ica? este %oarte util in testarea
ra*ida a unor conce*te de ti* 77P.
Eindo9s Ser+ice: de6+oltarea unui ser+iciu Eindo9s. Ser+iciile sunt acele a*licatii care *ornesc
automat la desc!iderea calculatorului si o%era su*ort in bac-ground *entru di+erse %unctionalitati ale
sistemului. De e,em*lu? ba6a de date 7racle lucrea6a ca un ser+iciu? *orneste odata cu sistemul si
desc!ide un /"istener/ ce asculta in mod *ermanent la un *ort *entru a ras*unde e+entualelor
comen6i S>" trimise de un client.
Proiecte de ti* /"ibrar3/: nu au inter%ata cu utili6atorul? nu *ot %i *ornite direct *entru ca nu contin
%unctia /$ain/. &le sunt %olosite doar *entru crearea di+erselor %unctii de biblioteca ce +or %i utili6ate
in *rogramele de ti* /a**lication/. "ibrariile sunt sal+ate *e disc sub %orma de %isiere D"" ce trebuie
im*ortate in s*atiul de lucru al *roiecteor ce +or %ace a*el la ele.
Version no.: 1 Page ) o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
2.1 Principalele ferestre de lucru din Visual Studio
Du*a desc!iderea unui *roiect? Visual Studio a%isea6a un ecran de lucru ce cu*rinde urmatoarele %erestre
utile:
%igura ,& Principalele erestre de lucru ale mediului Visual Studio
Fereastra /'oolbo,/: contine majoritatea controalelor utili6ate in crearea a*licatiilor: butoane?
'e,t2o,-uri? grid-uri? cone,iuni?etc. Sunt %oarte multe controale im*licite ale mediului VS? dar *ot %i
adaugate de asemenea alte controale din di+erse librarii sau instalari de a*licatii.
Fereastra de editare a codului de *rogram: aici se introduce e%ecti+ codul sursa al *rogramului
Fereastra /Solution &,*lorer/ a%isea6a structura solutiei: *roiectele ce a*artin de aceasta solutie?
*ro*rietatile %iecarui *roiect in *arte? %isierele ce com*un *roiectul.
Pro*erties: este %ereastra ce a%isea6a *ro*rietatile si e+enimentele asociate obiectului curent
selectat in *agina de lucru
&rror "ist: listea6a erorile a*arute la com*ilarea sau e,ecutia *rogramului
2.2 Comenzile de lucru utilizate in VS
Comen6ile des %olosite in editarea si rularea unui *rogram sunt:
F.: com*ilea6a si lansea6a in e,ecutie *rogramul curent @in modul DebugA
C'R"HS: sal+ea6a %isierele de lucru
Version no.: 1 Page 1 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
F) @2uild solutionA: com*ilea6a solutia
S:5F'HF.: o*reste e,ecutia *rogramului din modul Debug
F10: e,ecutie *as cu *as @%unctia a*elata se considera a %i un *asA
F11: e,ecutie *as cu *as cu intrarea in %unctia a*elata
F4: de%ineste sau sterge un brea-*oint in linia curenta
Version no.: 1 Page 8 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
, -einirea claselor in OOP
3.1 Proprietati, Constructori. Tipul Enum si DateTime
Se desc!ide mediul VS si crea6a un nou *roiect de ti* /Console **lication/ numit /'est 77P/. Se creea6a
un nou %older in cadrul *roiectului numit /Sensor/ si in acest %older se de%ineste o noua clasa numita
/Sensor2ase/.
5n cadrul acestei clase se de%inesc urmatoarele com*onente:
$embri *ri+ati: t3*e? +alue? timeStam*
Pro*rietatile *ublice '3*e? Value? 'imeStam*
Constructorii:
- 5m*licit
- *ublic Sensor2ase@Sensor'3*e t3*e? double +alue? Date'ime timeStam*A
- *ublic Sensor2ase@Sensor'3*e t3*e? double +alue? string timeStam*A
%igura .& Clasa +SensorBase+ si enumerarea +SensorT/pe+
Version no.: 1 Page 4 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura 0& Constructorii clasei SensorBase
"ista de sen6ori *otentiali cu care *oate lucra *rogramul este tinuta de o enumerare *ublica numita
/Sensor'3*e/. &numerarile sunt constructii sim*le in care se *ot da nume sugesti+e *entru numerele
naturale. De e,em*lu? este mult mai sugesti+ sa *rimesti un *arametru numit /:eartRate/ decat numarul 2
cat re*re6inta acel *arametru. $ai mult? daca se sterge sau se adauga un termen din enum? *rogramul nu
se modi%ica cu nimic? in continuare %unctia +a *rimi *arametrul /:eartRate/? c!iar daca acum acel
*arametru are +aloarea 1.
legerea unei +alori din enum se %ace sim*lu? se scrie numele enum-ului si se alege +aloarea
cores*un6atoare:
%igura 1& Selectarea unei 'alori dintr-o enumerare
Se obser+a ca in lista de *ro*rietati a clasei *ro*rietatea 'imeStam* @tim*ul la care s-a %acut masurareaA
a*are de doua ori. Prima +arianta 'imeStam* *rimeste si returnea6a o clasa de ti* Date'ime? iar a doua
+arianta *rimeste un string si con+erteste acel string intr-o structura Date'ime. Con+ersia unei date in string
se %ace cu metoda 'oString @timeStamp.ToString("dd-MMM-yy HH:mm") A? metoda ce *rimeste ca
*arametru stringul de %ormatare a datei calendaristice. Con+ersia in+ersa se %ace cu %unctia statica a clasei
Date'ime numita Parse&,act :
DateTime.ParseExact(vale! "dd-MMM-yy HH:mm"!"ltre#n$o.#nvariant"ltre)
3.2 Instantierea claselor
Se desc!ide %ereastra *rogramului *rinci*al @Program.csA si se scrie codul *entru instantierea clasei
Sensor2ase %olosind constructorul im*licit. Du*a crearea obiectului /sensor1/ se %olosesc *ro*rietatile
acestuia *entru introducerea +alorile de masurare @'3*e? 'imeStam* si ValueA. 'oate aceste +alori se
a%isea6a a*oi la consola *rin a*elul %unctiei Dis*la3SensorValue. ceasta %unctie *rimeste doi *arametri:
Version no.: 1 Page 10 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
o un string numit /!eader'e,t/ care +a %i a%isat in ca*ul listei de +alori
o o instanta a clasei /Sensor2ase/ care contine in%ormatiile de a%isat
%igura 2& "nstantierea clasei +SensorBase+ olosind constructorul implicit
Sa se de%ineasca un alt obiect de ti* /Sensor2ase/? dar utili6and de data aceasta constructorul cu
*arametri
Sa se a%ise6e +alorile acestui obiect *rin a*elul %unctiei /Dis*la3SensorValue@A/.
5ntrebare: de ce a %ost necesar sa se declare %unctia /Dis*la3SensorValue@A/ de ti* staticB Stergeti
atributul /static/ din de%initia %unctiei si obser+ati re6ultatul.
3.3 Constructori privati. !iectele Timer si "andom
Cum nu a+em sen6orii in mod e%ecti+? +a trebui sa construim o clasa care sa simule6e %unctionarea reala a
acestor sen6ori. ceasta clasa +a trebui sa instantie6e in mod aleatoriu un sen6or din lista /Sensor'3*e/ si
a*oi sa genere6e o +aloare aleatoare intr-un domeniu s*eci%ic acelui sen6or:
'em*eratura *oate +aria intre 0) si (0 de grade
;licemia intre 80 si 000 mgCdl
Pulsul inimii intre 00 si 200
Functia de simulare trebuie sa cree6e aceasta +aloare aleatoare in mod continuu cu o %rec+enta data de
%unctia *rinci*ala $ain.
Version no.: 1 Page 11 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
5n %olderul /Sensor/ se creea6a o noua clasa numita /Pum*SensorValues/. ceasta +a a+ea doar un singur
constructor *ublic? cel ce *rimeste numarul de secunde intre doua +alori ale sen6orilor.
%igura 3& Constructorii clasei PumpSensorValues
Constructorul im*licit +a %i declarat *ri+at *entru a nu *ermite instantierea unei clase %ara sa se stabileasca
*erioada intre doua +alori.
5ncercati sa creati un obiect de ti*ul /Pum*SensorValues/ *rin constructorul im*licit si obser+ati
eroarea generata de VS
5n constructorul clasei sunt create doua obiecte de u6 general.
Prima clasa instantiata este de ti*ul Random. cesta clasa este %olosita *entru generarea numerelor
aleatoare. Se instantia6a o singura data la intrarea in constructor si se *oate a*ela oriunde in *rogram
*entru a obtine un numar aleator intre doua limite date. ;enerarea numarului aleator se %ace *rin a*elul
%unctiei #e,t cu cele doua +ariante:
#e,t@int$a,A: generea6a un intreg aleator mai mic decat int$a,
#e,t@int$in? int$a,A: numarul aleator este cu*rins intre int$in si int$a,.
l doilea obiect utili6at este de ti*ul S3stem.'imers.'imer. cest obiect lucrea6a ca un ceas ce *oate %i
*rogramat sa a*ele6e o %unctie *eriodic la un inter+al de tim* dat. De %a*t? la s%arsitul %iecarui inter+al de
tim*? timerul +a genera un e+eniment /&la*sed/ la care noi trebuie sa ne abonam ca sa-l interce*tam in
mometul emiterii:
timer%ase.Elapsed &' ne( ElapsedEventHandler(timer%ase)Elapsed)*
Functia ce +a %i a*elata la %iecare tact al timerului este /timer2ase8&la*sed/. 5n aceasta %unctie trebuie sa
selectam in mod aleator un ti* de sen6or si sa-i dam o +aloare? a*oi sa a%isam *ro*rietatile sen6orului la
consola.
Version no.: 1 Page 12 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura 4& %unctia de generare si aisare a 'alorile aleatoare pentru sen$ori
'ot ce mai trebuie %acut ca sa a*ara +alorile la consola? este sa instantiem clasa Pum*SensorValues si sa
*ornim ceasul din clasa res*ecti+a:
%igura !5& "ntantierea clasei +PumpSensorValues+ si pornirea ceasului
#u trebuie uitat la iesirea din *rogram sa se o*reasca ceasul *entru a nu mai trimite e+enimente *e care sa
nu le interce*te6e nimeni.
5ntrebare: de ce am *utut a*ela %unctia /Dis*la3SensorValues/ in clasa /Pum*SensorValues/ %ara
sa am +reo instanta la clasa /Program/ B
Version no.: 1 Page 10 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Functiile StartPum*ing si Sto*Pum*ing sunt urmatoarele:
p+lic void StartPmping()
,
timer%ase.Start()*
-
p+lic void StopPmping()
,
timer%ase.Stop()*
-
5n %unctia /StartPum*ing@A/ *ornesc ceasul timer2ase si acesta imi +a trimite e+enimente la %iecare
/5nter+al/ de tim*.
/Sto*Pum*ing/ trebuie a*elata la s%arsitul *rogramului *entru a o*ri ceasul sa mai trimita e+enimente.
Version no.: 1 Page 1( o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
. Pre$entarea datelor
#.1 Solutii cu proiecte multiple. Ierar$izarea proiectelor
Pana acum am reusit sa generam date *entru sen6orii de masurare si sa le a%isam in %ereastra de ti*
consola. Dar acest ti* de a%isare nu este con+enabila *entru doctor. Doctorul ar a+ea ne+oie de un ecran
care sa-i a%ise6e +alorile sosite continuu de la sen6or? sa le *oata sorta du*a ti*ul de sen6or? sa-i %ie
semnalate alarme in ca6ul unei +alori ce de*aseste anumite limite.
5n acest sco* +om de6+olta un nou *roiect de ti* Eindo9s Form **lication care +a a+ea dre*t sco*
a%isarea intr-o maniera gra%ica a re6ultatelor de masurare.
$ai intai? se redenumeste solutia in /:ealt!$onitor/ @clic- drea*ta *e numele solutiei si alegem meniul
/Rename/A? iar *roiectul 'est77P se redenumeste /Sensor5n*ut/. Deci ne *ro*unem o solutie *entru
monitori6area starii de sanatate a *acientului? iar in cadrul acestei solutii *roiectul deja construit are rol de a
simula %unctionarea reala a sen6orilor.
Se desc!ide un nou *roiect in cadrul solutiei *entru *re6entarea datelor +enite de la sen6ori. cest nou
*roiect se denumeste /DataPresentation/ si se alege sa %ie *roeictul de *ornire a solutiei. Cand o solutie
contine mai multe *roiecte trebuie ales *roiectul de *ornire? cel ce +a lansa %unctia $ain@A.
cest nou *roiect trebuie sa a%ise6e datele %urni6ate de celalalt *roiect @Sensor5n*utA. 'otusi? *roiectele sunt
inde*endente si nu se *ot a*ela in mod direct %unctii dintr-un *roiect in altul. De aceea?trebuie alcatuita o
ierar!ie de *roiecte? in care un *roiect *oate %ace a*el la clasele dintr-un alt *roiect a%lat *e o ramura
in%erioara in cadrul ierar!iei. 5ncluderea unui *roiect co*il in cadrul ierar!iei se %ace *rin adaugarea acelui
*roiect la re%erintele *roiectului tata. Se %ace clic- drea*ta *e /Re%erences/ la *roiectul /DataPresentation/
si se alege dd Re%erence:
%igura !!& Selectarea unui proiect ca reerinta pentru proiectul curent
Re%erintele *ot %i adaugate din uni+ersul .#&' unde se gasesc majoritatea bibliotecilor de *rograme utile?
sau din tab-ul /C7$/ ce contine controale *articulari6ate? sau /Projects/ unde sunt listate toate *roiectele
curente ale solutiei curente.
Version no.: 1 Page 1. o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Se alege tab-ul /Projects/ si se selectea6a *roiectul /Sensor5n*ut/ *entru a se adauga la re%erintele
*roiectului curent.
Din acest moment *roiectul /DataPresentation/ *oate instantia si utili6a toate clasele *ublice declarate in
*roiectul /Sensor5n*ut/.
#.2 %ereastra utput
Se modi%ica constructorul *roiectului /DataPresentation/ *entru a lansa in e,ecutie %unctia /StartPum*ing/
din clasa /Pum*SensorValues/:
%igura !#& Lansarea in e(ecutie a unctiei de simulare a sen$orilor
C!iar daca %unctia de simulare a sen6orilor a *ornit? in %ereastra /DataPresentation/ nu se +ede nimic. #ici
nu are cum? din moment ce %unctia de simulare trimite +alorile generate la consola. 5ar acum consola nu
este +i6ibila *entru ca *roiectul curent /DataPresentation/ este de ti* /Eindo9s Form **lication/ si nu
a%isea6a consola.
'otusi? *utem +edea toate mesajele trimise la consola in tim*ul e,ecutiei unui *roiect daca se acti+ea6a
%ereastra /7ut*ut/ @meniul Vie9C7ut*ut din VSA. ceasta %ereastra se desc!ide in tim*ul e,ecutiei
*rogramului si a%isea6a mesajele de consola ale a*licatiei:
%igura !,& %ereastra Output aisea$a mesa6ele trimise la consola
Version no.: 1 Page 1) o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
#.3 Pro&ramare !azata pe evenimente. !iectele 'Dele&ate' si 'Event'
m +a6ut ca clasa /Pum*SensorValues/ a%isea6a datele doar la consola. Si totusi? noi am dori ca aceste
date sa %ie a%isate de %ereastra /DataPresentation/. 5n sc!imb? /Pum*SensorValues/ nu are nici o in%ormatie
des*re clasa container in care +a %i utili6ata? deci nu are acces la nici un obiect din aceasta clasa. &ste
aceeasi *roblema *e care o are obiectul /2utton/ dintr-o %orma oarecare. 5n momentul cand utili6atorul %ace
clic- *e buton? acesta ar trebui sa e,ecute o actiune in clasa container? cea care il contine. Dar e+ident?
butonul nu stie nimic des*re clasa container? el este un obiect din biblioteca .#&' si este instantiat in mii de
a*licatii de ti*ul /Eindo9s Form/.
'ot ce *oate sa %aca un buton in momentul cand user-ul %ace /clic-/ este sa lanse6e e+enimentul /Clic-/.
Daca este cine+a sa-l asculte @adica s-a scris o %unctie care sa *rinda e+enimentulA atunci actiunea clic- +a
a+ea a%ect? alt%el e+enimentul se *ierde in eter. Se *oate %ace o asemanare cu actiunile unui catel de *a6a.
Catelul de *a6a @ca si butonulA cand se naste? nu stie unde +a *a6i si cine-l +a asculta. Daca este *us sa
*a6easca o +ie de e,em*lu? tot ce *oate el este sa %aca galagie? adica sa emita e+enimente @in ca6ul de
%ata e+enimentul /'!ie%85nside/A. Daca este cine+a sa-l asculte bine? daca nu? e+enimentele se *ierd.
Pentru a *utea lansa si *rinde e+enimente? trebuie reali6ate cate+a actiuni:
De%inirea obiectulului /Delegate/: re*re6inta am*renta %unctiei care trebuie sa *rinda acel
e+eniment.
De%inirea obiectulului /&+ent/: este e+enimentul *ro*riu-6is.
"ansarea e+enimentului
Prinderea e+enimentului de %unctia /!andler/
'oate aceste actiuni se %ac automat cand se %ace double-clic- *e un buton in %ereastra de design. VS-ul
creea6a automat o %unctie @!andlerA care sa trate6e e+enimentul trimis de buton si tot ce a+em noi de %acut
este sa introducem cod in acea %unctie. Daca ne uitam in bac-ground @Designer.csA? obser+am ca in acel
%isier ?VS-ul introduce cod *entru legarea e+enimentului la %unctie:
%igura !.& atasarea unctiei +bTest7Clic)+ la e'enimentul +bTest.Clic)+
Re+enim la a*licatia noastra si sa *arcurgem *asii *entru lansarea si *rinderea e+enimentului ce anunta o
noua +aloare de la sen6ori.
$ai intai? in clasa ce *om*ea6a date de%inim delegatul si e+enimentul:
%igura !0& -einirea obiectelor de tip delegate si e'ent in clasa de generare a datelor de masurare
5ntai se de%ineste delegatul in a%ara oricarei clase. &ste ca orice de%initie de %unctie? numai ca i se *une in
%ata termenul /delegate/. 5n acest %el se de%ineste am*renta %unctiei care trebuie sa *rinda e+enimentul.
&+enimentul se declara in interiorul clasei si trebuie sa %ie *ublic *entru a %i cunoscut si in a%ara clasei.
"ansarea acestuia se %ace sim*lu? este ca un a*el de %unctie:
Version no.: 1 Page 11 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura !1& Lansarea e'enimentului +ne8SensorValueE'ent+
5ntotdeauna? inainte de lansare trebuie +eri%icat daca e+enimentul este di%erit de null. Fn e+eniment este nul
*ana in momentul cand se atasea6a un !andler la el. Daca nu are atasat nici un !andler care sa-l
interce*te6e? nu are sens sa se trimita e+enimentul? de aceea VS-ul il mentine nul.
tasarea !andler-ului la e+eniment se %ace in clasa container /DataPresentation/:
%igura !2&Atasarea unctiei +OnNe8SensorValue9andler+ la e'enimentul +ne8SensorValueE'ent+
5n constructorul clasei /DataPresentation/ se instantia6a clasa /Pum*Ser+erValues@0A/? se *orneste %unctia
de generare a datelor @StartPum*ingA si se atasea6a !andlerul la e+eniment.
"a %iecare 0 secunde %unctia /StartPum*ing/ +a genera un e+eniment a+and +alorile sen6orului ca argument
care in %inal +a %i tratat in !andler. Pentru moment? !andler-ul doar a%isea6a un /$essage2o,/ cu +alorile
sen6orului.
Du*a lansarea in e,ecutie a *roiectului? in %ereastra clasei /DataPresentation/ +a a*area la %iecare 0
secunde un mesaj cu +alorile *rimite in argument.
Version no.: 1 Page 18 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura !3&Valorile primite prin e'eniment de la clasa +PumpSensorValue+ sunt aisate in
*essageBo(
Sto* 1. $artie 2010
#.# Prezentarea datelor in Data(rid
Sco*ul %inal al *roiectului e sa *re6entam datele nu *rin mesaje? ci %olosind un grid care sa se *o*ule6e cu
datele +enite de la sen6ori.
Proiectul /DataPresentation/ este de ti* /Eindo9s Form **lication/? deci in cadrul lui a+em acces la
controalele +i6uale din 'ool2o,. Putem gasi la sectiunea /Data/ un control de +i6uali6are de ti* grid:
%igura !4& Controlul -ata:ridVie8 din ToolBo(
Version no.: 1 Page 14 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Selectam acest control si %acem drag-and-dro* in %ereastra *rinci*ala a *roiectului. &l +a %i instantiat
automat in %unctia /5nitiali6eCom*onents/ a %ormei? noi trebuie doar sa-i setam *ro*rietatile in stilul dorit. Dar
in *rimul rand trebuie setate numele gridului si /DataSource/? adica sursa de unde gridul isi +a lua datele ca
sa le a%ise6e:
%igura #5&Setarea sursei de date pentru gridul de aisare
Se *une numele /dgSensorValue"ist/ iar *entru DataSource se merge *e butonul de rulare in jos si se
alege din %ereastra a*aruta lin-ul /dd *roject data source../. Se alege a*oi data source de ti* 7bject unde
regasim toate clasele de%inite de noi si care *ot juca rolul de sursa *entru grid. Din names*ace-ul
/Sensor5n*ut/ alegem clasa /Sensor2ase/ dre*t sursa *entru grid.
7data selectata sursa? VS-ul creea6a automat un obiect de legatura intre grid si clasa sursa. cest obiect
este de ti*ul /2indingSource/ si a*are automat in *artea de jos a %erestrei de design. Daca ne uitam in
%unctia /5nitiali6eCom*onents/ *utem gasi codul scris in mod automat *entru legarea gridului la
2indingSource si 2indingSource la Sensor2ase:
Se creea6a un obiect de ti*ul 2indingSource:
t.is.sensor%ase%indingSorce ' ne( /orms.%indingSorce(t.is.components)*
Se alege Sensor2ase ca DataSource *entru acest 2indingSource:
t.is.sensor%ase%indingSorce.DataSorce ' typeo$(Sensor#npt.Sensor%ase)*
Se atasea6a 2indingSource la datagrid:
t.is.dgSensor0ale1ist.DataSorce ' t.is.sensor%ase%indingSorce*
Du*a aceasta bindare gridul +a a+ea coloanele setate du*a *ro*rietatile *ublice din Sensor2ase. Se *oate
modi%ica modul de *re6entare a datelor @coloanele a%isate? %ontul dorit? !eadere si multe alteleA din %ereastra
de *ro*rietati a gridului.
Du*a setarea tuturor *ro*rietatilor *entru datagrid se rulea6a *rogramul si se obser+a ca gridul a*are in
%ereastra cu toate coloanele stabilite in design. Si totusi? nu are nici o linie de date inclusa.Si asta deoarece
clasa /Sensor2ase/ este doar o de%initie? ea nu are e%ecti+ date in ea.
Se *o*ulea6a gridul cu date numai daca ii dam ca sursa o lista de obiecte de ti* Sensor2ase? %iecare obiect
a+and +alorile date de clasa Pum*SensorValues.
Version no.: 1 Page 20 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura #!& Popularea listei sensorValueList si setarea ei ca -ataSource pentru grid
De%inim in clasa DataPresentation o lista de ti*ul Sensor2ase
1ist2Sensor%ase3 sensor0ale1ist ' ne( 1ist2Sensor%ase3()*
5ar in !andler-ul de tratare a e+enimentului *rimit de la sensor? comentam linia cu $essage2o,-ul @nu mai
+reau sa a%ise6 in%ormatia *rin mesajA si insere6 linia:
t.is.%egin#nvo4e(ne( 0oid/nctionDelegate(%indData5ridTo1ist6$0ales))*
....! Controalele de tip :;" nu sunt t<read-sae
5n loc de linia cu 2egin5n+o-e? as %i +rut sa a*ele6 direct %unctia 2indData;rid'o"ist7%Values@A. Dar daca
%acem asa ce+a? a*are o eroare %oarte interesanta la e,ecutie:
%igura ##& Eroare& un alt t<read accesea$a datagridul
Care este *roblema de %a*tB &roare s*une ca un alt t!read @%ir de e,ecutieA decat cel care l-a creat?
accesea6a datagridul. Ce sunt t!read-urile sau %irele de e,ecutie. Se stie ca Eindo9s-ul *oate lansa mai
multe a*licatii simultan. Pentru %icare a*licatie cand e *ornita? Eindo9s-ul creea6a un nou %ir de e,ecutie
Version no.: 1 Page 21 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
*entru acea a*licatie si-i da drumul sa rule6e. 5n acest %el se aduna mai multe %ire de e,ecutie? toate cerand
tim* micro*rocesor *entru e,ecutie. 5n %unctie de *rioritatea lor? Eindo9s-ul le acorda la %iecare un tim*
micro*rocesor in care acel t!read sa-si %aca treaba. Deci micro*rocesorul *orneste un t!read? a*oi il
o*reste si da micro*rocesorul la alt t!read? a*oi la altul? a*oi se intoarce iar la *rimul si tot asa.
celasi multit!reading se intam*la si-n a*licatia noastra. Clasa Pum*SensorValues are o %unctie de *ornire
a ceasului:
p+lic void StartPmping()
,
timer%ase.Start()*
-
ceasta %unctie a*arent ne+ino+ata de %a*t creea6a un alt t!read in care +a lucra ceasul. Ceasul este un
obiect ce lucrea6a in bac-ground si nu are sens sa ocu*e din t!readul curent de e,ecutie. &l isi desc!ide
un t!read se*arat de unde trimite din cand in cand e+enimente de ti* /'ime8&la*sed/.
'e!nica *rogramarii de ti* multit!reading este %oarte utila atunci cand trebuie inde*linite tas-uri mari
consumatoare de tim*: do9nload-area unui %isier mare de *e internet? accesul la o ba6a de date?
desc!iderea de %isiere mari? etc. Daca aceste tas-uri s-ar e,ecuta in acelasi %ir de e,ecutie cu cel *rici*al ce
ras*unde de inter%ata cu utili6atorul? atunci aceasta inter%ata ar %i ing!etata @%roo6enA *e tim*ul rularii lor.
dica *rogramul nu mai ras*unde la nici o actiune a utili6atorului deoarece este ca*ti+ in acel tas- lung. De
aceea se *re%era ca acel tas- se *orneasca *e un alt t!read? iar t!readul *rinci*al sa ramana acti+ *entru a
ras*unde la comen6ile utili6atorului? si cand t!readul secundar se termina? sa trimita un e+eniment catre
t!readul *rinci*al.
Cam asa lucrea6a si 'imer-ul? el rulea6a *e un t!read secundar de unde trimite e+enimente catre t!readul
nostru *rinci*al: cel ce a%isea6a %ereastra si ras*unde la butoane. 'oate bune si %rumoase *ana cand
t!readul secundar arunca un e+eniment? acesta este *rins intr-o %unctie si acea %unctie +rea sa accese6e
datagrid-ul @sau orice alt control +i6ual din %ereastraA. 5n acel moment a*are eroarea descrisa mai sus?
deoarece controalele +i6uale nu sunt /t!read-sa%e/? adica nu lucrea6a bine *e mai multe %ire de e,ecutie.
#ici nu au cum daca ne gandim ca t!readurile lucrea6a intretesut? adica se intreru* unul *e altul in mod
*ermanent. Si se *ot intam*la situatii cand un t!read modi%ica culoarea la un control in +erde de e,em*lu si
este intreru*t in acest tim* de un alt t!read care modi%ica in rosu. Ce culoare ar trebui sa aiba controlul la
s%arsitB De aceea s-a !otarat ca toate controalele +i6uale nu lucrea6a multit!reading si nu acce*ta controlul
decat de la t!readul care l-a instantiat.
Pentru a sari in t!readul *rinci*al din t!readul secundar? a*elam %unctia 2egin5n+o-e? care *une in coada
de mesaje al t!readului *rinci*al %unctia ce trebuie e,ecutata. &ste aceeasi %unctie
/%indData5ridTo1ist6$0ales/? dar *rin a*elul 2egin5n+o-e eu o trimit s*re e,ecutie t!read-ului
*rinci*al. Fiind e,ecutata de t!read-ul *rinci*al? se *aote umbla la controlul datagrid si sa-i setam
DataSource *e lista de +alori obtinuta in celalalt t!read.
private void %indData5ridTo1ist6$0ales()
,
dgSensor0ale1ist.DataSorce ' nll*
dgSensor0ale1ist.DataSorce ' sensor0ale1ist*
-
Deci? la %iecare e+eniment *rimit de la celalalt t!read? e+eniment ce +ine du*a el cu o noua +aloare de
sen6or? noi adaugam in lista acea +aloare si reconectam lista la datagrid *entru a%isare.
Version no.: 1 Page 22 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura #,& %ereastra principala de pre$entare a datelor cu datagrid-ul legat la lista de 'alori
#.) Controale vizuale* C$ec+,o-, Te-t,o-. Clasa Dictionar.
5n constructorul clasei de *re6entare a datelor se startea6a o singura instanta a clasei Pum*SensorValues.
5n realitate sunt mai multi *acienti conectati la a*licatia de monitori6are ce rulea6a *e calculatorul
doctorului. 5n a%ara de +alorile de masurare? gridul de +i6uali6are a datelor trebuie sa a%ise6e si codul
*acientului de la care *ro+in datele.
5n acest sco* se modi%ica clasa /Sensor2ase/ sa contina si codul *acientului *entru care trimite +alorile.
Version no.: 1 Page 20 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura #.& Adaugarea codului de pacient in clasa cu 'alorile sen$orilor
Constructorul clasei /Pum*SensorValues/ se modi%ica *entru a *rimi ca *arametri codul *acientului *entru
care trimite +alori? cat si inter+alul de tim* intre doua masurari succesi+e.
%igura #0& Patient code trebuie adaugat si in clasa PumpSensorValues
5ar cand se trimite e+enimentul /ne9SensorValue&+ent/ acesta trebuie sa contina in argument si codul de
*acient:
%igura #1& E'enimentul +ne8SensorValueE'ent+ include si codul de pacient
Ramane ca si in gridul de *re6entare a datelor sa se adauge o coloana de a%isare a codului de *acient. Se
desc!ide %ereastra de *ro*rietati a gridului si sa da clic- *e dd *entru a adauga noua coloana
/PatientCode/ de%inita in clasa /Sensor2ase/ %olosita ca sursa de date *entru grid:
Version no.: 1 Page 2( o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura #2& Adaugarea coloanei PatientCode in datagrid
cum ca a+em si codul de *acient in Sensor2ase? *utem construi o inter%ata ce ne *ermite sa startam un
*acient nou? sau sa o*rim trimiterea datelor de la un *acient deja *ornit.
Vom introduce in %ereastra /DataPresentation/ doua butoane /Start Pum*ing/ si /Sto* Pum*ing/ care sa
starte6e un *acient selectat dintr-un combo2o,. De asemenea? inter+aulul de tim* dintre doua masuratori
succesi+e se citeste dintr-un te,t2o,:
%igura #3& %ereastra -ataPresentation cu butoanele de startare si oprire a monitori$arii
C!ec-2o,-ul de selectare a *acientilor are ca DataSource o enumerare unde se introduc toate codurile de
*acienti.
Version no.: 1 Page 2. o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura #4& Enumerarea ce include codurile de pacienti
5ar aceasta enumerare se *une ca sursa de date *entru c!ec-2o,:
%igura ,5& Atasarea unei enumerari la un C<ec)Bo(
2utonul /Start $onitoring/ trebuie sa *orneasca monitori6area *entru *acientul selectat in c!ec-2o, a+and
ca inter+al de tim* +aloarea din te,t2o,-ul a%erent:
%igura ,!& Codul aerent butonului +Start *onitoring+
Functia trebuie sa +eri%ice ca c!ec-2o,-ul are un *acient selectat si ca te,t2o,-ul *entru numarul de
secunde contine un numar intreg +alid. De e,em*lu? daca utili6atorul introduce numarul /12a,/? acest te,t
nu *oate %i con+ertit la un intreg si trebuie a%isat mesj de eroare. Prinderea acestei situatii se %ace *rintr-o
constructie de ti* tr3-catc!.
Se scrie o %unctie /startPum*ing/ care *rimeste ca *arametri codul *acientului si numarul de secunde intre
doua masurari *entru acel *acient si aceasta %unctie trebuie sa starte6e monitori6area *entru acel *acient:
Version no.: 1 Page 2) o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,#& %unctia StartPumping cu parametrii cod pacient si perioada de timp
Problema care a*are in momentul cand se lucrea6a cu mai multi *acienti este ca *utem din greseala sa
*ornim acelasi *acient de mai multe ori si am *rimi de la acelasi cod de *acient seturi de date di%erite.
Putem indre*ta aceasta greseala daca construim un dictionar care sa includa toti *acientii acti+i im*reuna
cu obiectul /Sensor2ase/ atasat.
Clasa /Dictionar3/ lucrea6a ca o colectie de *erec!i de obiecte? *rimul obiect din *erec!e a+and
semni%icatia unei -ei. Perec!ile de obiecte se adauaga in dictionar %oarte sim*lu *rin comanda dd si a*oi
sa *oate cauta o anumita *erec!e daca se da -eia *entru acea *erec!e:
Se de%ineste o noua instanta a clasei Dictionar3 *entru *erec!ea de obiecte: PatientCode&num si
Pum*SensorValues:
Dictionary2Patient"odeEnm! PmpSensor0ales3 dictPatientPmp ' ne(
Dictionary2Patient"odeEnm! PmpSensor0ales3()*
Du*a startarea unui nou *acient? *erec!ea *acient-*um*SensorValue se adauga in dictionar:
dictPatientPmp.7dd(pat"odeEnm! sensor0alesPmp)*
5nainte de startare se cauta in dictionar daca nu cum+a acest *acient este deja acti+. 5n ca6
ade+arat se da mesaj de eroare:
i$ (dictPatientPmp."ontains8ey(pat"odeEnm))
,
Message%ox.S.o(("T.e selected patient .as t.e pmp already started")*
retrn*
-
Functia a%erenta butonului /Sto* $onitoring/ trebuie sa o*reasca monitori6area *entru acel *acient si a*oi
sa elimine *acientul din dictionarul cu *acientii acti+i:
Version no.: 1 Page 21 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,,& Oprirea monitori$arii pentru un pacient si eliminarea lui din dictionarul pacientilor acti'i
5n s%arsit am obtinut ce+a... un grid care se incarca *eriodic cu o noua linie ce a%isea6a ultima masuratoare
obtinuta de la sen6ori a%erenti unui *acient acti+? *utem de asemenea starta sau sto*a monitori6area unui
*acient cu o *erioada de tim* *rogramabila.
'otusi treaba nu e gata? mai trebuie lucrat la inter%ata @butoane de %iltrare a in%ormatiei? alarme? etcA cat si
alte tas-uri ramase in aer:
Sal+area datelor intr-o ba6a de date @ce ne %acem daca doctorul +rea sa +ada +alorile de
acum o sa*tamana si noi am *ierdut lista de +aloriBA
Comunicare 'CPC5P intre Pum*SensorValues si datagrid @sa nu uitam ca in *rinci*iu?
*acientul sta acasa si Pum*SensorValues rulea6a la *acient acasa? *e cand
DataPresentation rulea6a la doctor in cabinet? deci *e calculatoare di%eriteA.
Si altele...
Version no.: 1 Page 28 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Version no.: 1 Page 24 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
0 Sal'area inormatiilor in ba$a de date
Pana in acest moment? datele ce +in de la *acient sunt *use intr-o lista dinamica si a%isate in datagrid. Daca
se inc!ide a*licatia? atunci toate in%ormatiile *rimite se +or *ierde? doctorul nu are nici o *osibilitate sa
anali6e6e o in%ormatie din trecut. #u este su%icient sa a%isam datele? trebuie ca aceste date sa %ie sal+ate *e
un su*ort *ermanent si sa *oata %i restaurate la un moment dat? daca doctorul doreste sa %aca o e,aminare
a *acientului si are ne+oie de istoricul datelor de masurare.
5n acest ca*itol +om re6ol+a *roblema sal+arii datelor intr-o ba6a de date si *roblema in+ersa? de citire a
in%ormatiilor din ba6a *entru *erioade de tim* stabilite si un *acient dat.
'otusi? nu +om %olosi o ba6a de date %oarte mare gen 7racle? deoarece nu sunt %oarte multe date si %oarte
com*le,e de sal+at si nu are sens sa ocu*am memoria cu motorul ba6ei de date. $ai ales ca? e *osibil ca
aceasta a*licatie sa rule6e *e un tele%on mobil ce are constrangeri e+idente de memorie dis*onibila. De
aceea +om utili6a S>"ite? o ba6a de date mult mai mica si %ara sa necesite instalari com*le,e. cest
S>"ite este un sim*lu D"" care se sal+ea6a odata cu a*licatia si *oate %i a*elat in orice moment *entru
accesarea ba6ei de date ce este %ormata dintr-un singur %isier.
).1 Crearea !azei de date S/0ite
$ai intai se instalea6a S>"ite database *rin rularea a*licatiei <S>"ite-1.0.)2.0-setu*.e,e=. Se desc!ide
a*oi <sIliteadmin.e,e=? a*licatia cu care administram ba6a de date S>"ite si se creea6a o noua ba6a de
date @butonul A.
%igura ,.& Crearea ba$ei de date =Patient-ata> in S?Lite Administrator
Se desc!ide a*oi ba6a de date si se creea6a un table *entru sal+area datelor ce +in de la *acient:
Version no.: 1 Page 00 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,0& Crearea tabelului =Patient-ata> pentru sal'area datelor ce 'in de la pacienti
5n a%ara de cele *atru cam*uri de +alori ce +in de la *acient se mai adauga un cam* numit id de ti* +arc!ar
si care +a %i coloana de ti* <*rimar3 -e3= *entru acest tabel. 'abelul se mai *oate crea si *rin instructiunea
S>" s*eci%ica:
CR&'& '2"& JPatientDataK @
JidK VRC:R@1)A PR5$RL M&L #F""?
J*atient8codeK VRC:R@10A #F""?
Jsensor8t3*eK VRC:R@20A #F""?
Jtimestam*K D'& #F""?
J+alueK #F$&R5C #F""
A
).2 Data 1c2uisition 0a.er * interfata intre !aza de date si aplicatia (3I
#u este indicat sa se accese6e direct ba6a de date din %unctiile ce a*artin de clasa ;F5. Cone,iunea la
ba6a de date? %unctiile S>"? trebuie sa %ie create *e un ni+el intermediar? de sine statator si care +a %i a*elat
de clasa su*erioara de ti* ;F5 *entru orice accesare a ba6ei de date.
daugam un nou *roiect la solutie? dar de data aceasta de ti* <Class "ibrar3= @deci un sim*lu %isier D""?
%ara nici o inter%ata cu utili6atorulA? *e care-l denumim <DataStore=:
Version no.: 1 Page 01 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,1& Adaugarea proiectului =-ataStore> de tip =Class Librar/> la solutie
Dorim sa utili6am S>"ite ca ba6a de date *entru acest *roiect? deci trebuie adaugate la *roiect re%erintele
S3stem.Data si S3stem.Data.S>"ite. 5n cadrul *roiectului +om utili6a si clasa <Sensor2ase= de%inita in
*roiectul <Sensor5n*ut=? deci +a trebui adaugata si aceasta re%erinta @add re%erence? sectiunea <Projects=A.
0.#.! -einirea string-ului de conectare la ba$a de date in pagina de
proprietati a proiectului
String-ul de conectare la ba6a de date @unde se gaseste ba6a de date si modul de conectare la eaA
re*re6inta o in%ormatie care este accesata ori de cate ori trebuie sa lucram cu ba6a de date. De aceea?
acesta in%ormatie se sal+ea6a o singura data in *agina de *ro*rietati a *roiectului si +a %i citita din *agina ori
de cate ori este ne+oie de ea. Pagina de *ro*rietati este o modalitate de gestionare sim*la si ra*ida a
resurselor comune *roiectului. 7 resursa @cum este acest string de conectareA se sal+ea6a o singura data
in *agina de *ro*rietati si a*oi +a %i +i6ibila *e tot cu*rinsul *roiectului.
Se desc!ide *agina de *ro*rietati a *roiectului si se de%ineste la sectiunea <Settings= stringul de conectare
la ba6a de date S>"ite:
Version no.: 1 Page 02 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,2& -einirea string-ului de conectare la ba$a de date S?Lite in pagina de proprietati a
proiectului
Se *une numele *ro*rietatii <ConnStringS>"ite=? se alege la <'3*e= ti*ul resursei <Connection String=? iar la
<+alue= se da clic- *e butonul *entru a de%ini cone,iunea cu ajutorul Ei6ard-ului. Se desc!ide Ei6ard-ul
si se selectea6a la <DataSource= dri+er-ul <.#&' Frame9or- Data Pro+ider %or S>"ite=? iar la <Data2ase= se
merge cu butonul <2ro9se= si se selectea6a %isierul creat *entru ba6a de date. "a s%arsit se *oate %ace si un
test de +eri%icare daca cone,iunea este setata corect @butonul <test Connection=A.
).3 Clasa de interfata cu !aza de date
0.,.! Sal'area inormatiilor in ba$a de date
7data ce am de%init cone,iunea cu ba6a de date? *utem construi %unctia de adaugare a unei +alori de
masurare @o instanta de Sensor2aseA in ba6a de date. daugam o noua clasa la *roiectul <DataStore=
numita <D"8PatientData= :
Version no.: 1 Page 00 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,3& %unctia de inserare a unei 'alori de masurare in ba$a de date
&ta*ele ce trebuie *arcurse *entru sal+area +alorilor de masurare in ba6a de date sunt urmatoarele:
Se de%ineste un obiect de ti*ul <S>"iteConnection= cu care *utem sa ne conectam la ba6a de date.
String-ul de conectare se citeste din %isierul de *ro*rietati ale *roiectului
@Properties.Settings.De$alt."onnStringS91iteA.
Se de%ineste obiectul S>"iteCommand cu care +om e,ecuta instructiunea S>" de inserare in ba6a
de date
Setam instructiunea S>" ce trebuie e,ecutata de S>"iteCommand
Setam *arametrii ce trebuie trimisi la S>"iteCommand cu +alorile de masurare *rimite *rin obiectul
sensorData.
Desc!idem cone,iunea la ba6a de date si e,ecutam comanda S>"
5nc!idem cone,iunea la ba6a de date
'rebuie obser+at ca accesul la ba6a de date s-a %acut *rin constructia tr3-catc!-%inall3 *entru a ne asigura
ca tratam eroarea a*aruta in ca6ul cand ba6a de date nu ras*unde.
'ot ce mai ramane de %acut este de a a*ela %unctia de sal+are in ba6a de date in momentul cand *roiectul
<DataPresentation= *rimeste o noua +aloare de masurare *rin e+enimentul <ne9SensorValue&+ent=:
Version no.: 1 Page 0( o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura ,4& Tratarea e'enimentului =ne8SensorValueE'ent>& sal'are in ba$a si aisare in datagrid
#u trebuie sa uitam sa adaugam re%erinta la *roiectul <DataStore= in cadrul *roiectului <DataPresentation=.
5n s%arsit? *utem +eri%ica daca totul lucrea6a 7M? *ornim a*licatia cu F.? startam *acientul 0101 si du*a
cat+a tim* ne uitam in ba6a de date cu ajutorul *rogramului S>"ite dminstrator. Desc!idem o %ereastra de
comen6i S>" si introducem comanda S>" de +i6uali6are a tabelei <PatientData=:
%igura .5& Comanda S?L de 'i$uali$are a datelor din tabela Patient-ata
&,ecutam comanda S>" cu tasta F4 si ar trebui sa obser+am datele sal+ate in tabela de a*licatia <:ealt!
$onitor=:
%igura .!& Vi$uali$area datelor din ba$a in S?Lite Administrator
Version no.: 1 Page 0. o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
0.,.# Citirea inormatiilor din ba$a de date
Stocarea in%ormatiilor in ba6a de date *ermite doctorului in orice moment sa anali6e6e datele din trecut
*entru un *acient dat. 5n *rimul rand trebuie creata o sectiune de %iltrare a datelor unde doctorul sa-si
selecte6e *acientul *e care +rea sa-l anali6e6e si inter+alul de tim* *entru care +rea sa +ada datele.
Se adauga un %ereastra <DataPresentation= un control de ti* ;rou*2o, ce contine doua controle de %iltrare:
combo2o, *entru selectia *acientului
mont!Calendar ce selectea6a 6iua *entru care se doreste a %i +i6uali6ate datele
buton *entru e%ectuarea %iltrarii: <Dis*la3 Selected data=.
%igura .#& %ereastra -ataPresentation dupa ce s-a adaugat sectiunea de iltrare
Du*a selectia *acientului si a 6ilei de +i6uali6are? utili6atorul %ace clic- *e butonul <Dis*la3 Data= si in acel
moment trebuie citita din ba6a de date lista tuturor masuratorile sal+ate in acea 6i *entru res*ecti+ul
*acient.
5n acest sco*? clasa <D"8PatientData= trebuie sa %ie com*letata cu o %unctie de citire a in%ormatiilor din
ba6a de date:
Version no.: 1 Page 0) o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura .,& %unctia de citire din ba$a de date a datelor de masurare pentru un pacient si o $i stabilita
Functia de citire din ba6a de date are urmatoarea structura:
se creea6a o noua lista <sensorValue"ist= unde +or %i sal+ate in%ormatiilor gasite in ba6a
se de%ineste un nou obiect de ti* S>"iteConnection si un obiect S>"iteCommand
se scrie instructiunea S>" de selectie din ba6a de date si se atasea6a obiectului S>"iteCommand
se adauga *arametrii de %iltrare: *atient8code? min'ime si ma,'ime
se desc!ide un S>"iteReader in care se sal+ea6a toate liniile aduse din ba6a de date de %ra6a
select @reader N cmd.&,ecuteReader@AOA.
Se *arcurge reader-ul linie cu linie? se %ace con+ersia datelor aduse de %ra6a select la ti*ul
Sensor2ase si se adauga noul item la lista de +alori.
"a s%arsit se inc!ide cone,iunea? reader-ul si se returnea6a lista de +alori.
'otusi a+em o mica *roblema: *roiectul <DataStore= nu cunoaste ti*ul de date <PatientCode&num= cu care
trebuie sa lucre6e %unctia <;etData= *entru ca aceasta enumerare este de%inita in *roiectul
Version no.: 1 Page 01 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
<DataPresentation=. r trebui ca *roiectul <DataPresentation= sa %ie adaugat in lista de re%erinte a *roiectului
<DataStore=. Dar acest lucru nu este *osibil *entru ca? deja *roiectul <DataStore= este re%erinta la *roiectul
<DataPresentation= si ar re6ulta o re%erinta circulara. #u este *osibil ca un *roiect P1 se %ie re%erinta la alt
*roiect P2 si in acelasi tim* *roiectul P2 sa %ie re%erinta la P1. Deci nu se *oate sa un *roiect sa %ie tata la
alt *roiect si in acelasi tim* sa %ie %ie si co*il la acelasi *roiect.
Din acest moti+? se creea6a un nou *roiect numit <CommonRe%erences= care +a contine doar un %isier unde
+or %i de%inite toate ti*urile de obiecte comune celorlalte *roiecte. cest *roiect +a %i adaugat ca re%erinta la
toate *roiectele ce lucrea6a cu acele ti*uri de date. &+ident? ca acest *roiect nu trebuie sa %aca re%erire la
nici un alt *roiect din solutie.
%igura ..& Proiectul =CommonReerences> contine toate deinitiile particulare ale tipurilor de date
m mutat de%initiile <PatientCode&num= si <Sensor'3*e= in <CommonRe%erences= ast%el incat acestea sa %ie
+i6ibile in toata solutia %ara *robleme de re%erinta circulara.
'ot ce mai ramane *entru +i6uali6area datelor din ba6a de date e sa im*lementam codul *entru butonul
<Dis*la3 selected Data=:
Version no.: 1 Page 08 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura .0& Aisarea 'alorilor din ba$a de date
%isarea se %ace in acelasi datagrid? trebuie doar sa sc!imbam *ro*rietatea <dataSource= *entru acest grid
*e lista de +alori adusa de %unctia D"8PatientData.;etData@A. 'otusi? %olosind acelasi grid *entru a%isarea
ambelor ti*uri de +alori? atat cele *rimite online de la *atientii acti+i? cat si cele aduse din ba6a de date?
trebuie de%inita a +ariabila logica care sa s*eci%ice ti*ul de date ce trebuie +i6uali6ate:
private +ool displayT.e:eceivingData ' tre*
5ar aceasta +ariabila +a %i setata cores*un6ator *e cele doua butoane <Dis*la3 Selected Data= si <Dis*la3
Recei+ed Data=:
%igura .1& %unctia <andler pentru butonul =-ispla/ Recei'ed -ata>
Version no.: 1 Page 04 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
1 Transmiterea datelor intre aplicatii. Soc)et TCP@"P
Pana acum? atat *roiectul care *roducea date @Sensor5n*utA? cat si *roiectul care consuma datele
@DataPresentationA? rulea6a sub aceeasi solutie? in acelasi calculator si atunci e+enimentele trimise de
%urni6orul de date *ot %i rece*tionate de consumatorul de date. Si totusi? realitatea sta un *ic alt%el: %urni6orul
de date rulea6a la *acient acasa? iar rece*torul rulea6a la medic in cabinet. 5ntre ele e,ista o legatura
internet sau intranet *rin care trebuie transmise datele.
5n acest ca*itol +om anali6a modul de conectare a celor doua a*licatii *rintro legatura de ti* Soc-et 'CPC5P.
'e!nologia Soc-et lucrea6a *e ar!itectura client-ser+er. Se desc!ide un ser+er 'CPC5P care rulea6a un
listener ce asculta la un *ort dat cererile de conectare de la di+ersi clienti 'CPC5P din retea. Cand soseste o
cerere de conectare? se desc!ide un canal de comunicatii intre cele doua a*licatii *rin care *ot %i trans%erate
date in ambele sensuri.
Se modi%ica *roiectul /DataPresentation/ *rin adaugarea unor radio butoane care sa selecte6e modul de
transmitere a datelor:
*rin 'CPC5P la un calculator dat de o adresa 5P
direct la calculatorul curent
%igura .2& Proiectul -ata Presentation cu posibilitatea de a alege canalul de comunicare a datelor
Version no.: 1 Page (0 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
Pentru a reali6a o comunicatie 'CPC5P trebuie construite urmatoarele obiecte:
'c*Client ce *rimeste datele de masurare de la sensor? le im*ac!etea6a intr-un %ormat te,t si le
transmite la ser+er
'c*Ser+er care desc!ide listenerul si acce*ta cererile de cone,iune sosite de la client? *rimeste
te,tul de la client? il des*ac!etea6a in %ormat Sensor2ase si-l trimite mai de*arte la
/DataPresentation/
&+enimentul *rin care ser+erul sa transmita la inter%ata DataPresentation +alorile *rimite de la client
Se creea6a un nou *roiect in cadrul solutiei numit /'CPCommunication/? *roiect ce include doua clase:
'CPCommClient si 'CPCommSer+er:
%igura .3&Solutia +9ealt<*onitor+ cu toate proiectele componente
4.1 !iectul TCPCommClient
5n continuare se *re6inta clasa /'CPCommClient/ cu urmatoarele %unctionalitati:
Primeste data de ti* /Sensor2ase/ *entru a %i trimisa la ser+er
Porneste un nou %ir de e,ecuie @t!readA care sa se ocu*e se*arat de desc!iderea cone,iunii si
trimiterea datelor
5m*ac!etarea clasei /Sensor2ase/ intr-un te,t du*a un anumit %ormat standard
5nc!iderea %irelor de e,ecutie ramase sus*endate daca ser+erul re%u6a sa ras*unda la cererea de
dialog
Sa luam aceste %unctii *e rand:
Version no.: 1 Page (1 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
1.!.! "mpac<etarea datelor pentru transmisie
Clasa 'CPCommClient a%isea6a urmatoarele %unctii *ublice:
Constructorul clasei
%igura .4& Constructorii clasei TCPCommClient
Se obser+a ca constructorul im*licit al clasei a %ost declarat *ri+at ast%el incat sa nu *oata %i *osibila o
instantiere a clasei de %orma /ne9 'CPCommClient@A/? adica sa se cree6e o instanta %ara a da si adresa 5P
a ser+erului la care trebuie sa se conecte6e clientul *entru a trimite date. Singurul constructor dis*onibil din
e,terior este cel ce *rimeste ca *arametru adresa 5P a ser+erului. 5n acest %el ne asiguram ca toti clientii
'CP creati +or a+ea setata adresa 5P a ser+erului cu care trebuie sa dialog!e6e.
/SendSignalData/ ce *rimeste cele *atru +alori din clasa Sensor2ase in sco*ul trimiterii lor catre
ser+er.
Version no.: 1 Page (2 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura 05& %unctiile de primire si impac<etare a datelor ce trebuie trimise la ser'er
Functia ce *rimeste datele *entru transmisie a*elea6a mai intai %unctia de im*ac!etare a datelor in %ormat
te,t? du*a care %ace a*el catre %unctia de trimitere a te,tului. &ste mai a+antajoasa trimiterea sub %orma de
te,t a datelor *entru ca *ot %i *rocesate cu ajutorul %unctiilor de ti* string si in *lus? sender-ul si recei+er-ul
*ot a+ea structuri de date di%erite? totul e sa se stabileasca %ormatul de im*ac!etare care sa %ie res*ectat de
ambele *arti.
S-a decis asu*ra urmatorului %ormat:
- Simbolul /P/ semni%ica ince*utul si s%arsitul mesajului
- Simbolul /?/ se*ara cam*urile de date s*eci%ice clasei /Sensor2ase/
- 7rdinea de im*ac!etare este urmatoarea: Sensor'3*e? 'imeStam*?
PatientCode? Value.
Concatenarea acestor string-uri in mesajul de trimis se %ace cu jutorul %unctiei /**end/ din cadrul clasei
/String2uilder/.
1.!.# Crearea unui nou ir de e(ecutie pentru iecare dialog cu ser'erul
Functia ce trimite e%ecti+ mesajul te,t catre ser+er este listata in continuare:
%igura 0!& Startarea unui nou t<read pentru trimiterea datelor
Crearea unui nou %ir de e,ecutie *entru trimiterea te,tului la ser+er se %ace *rin a*elul constructorului clasei
/'!read/ din names*ace-ul /sing System.T.reading*/:
Se creea6a instanta clasei /'!read/:
T.read ne(T.read ' ne( T.read(ne(
Parameteri;edT.readStart(SendSignalText<e(T.read))*
Se adauga t!read-ul %ormat in lista de t!read-uri a clasei
Version no.: 1 Page (0 o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
myT.read1ist.7dd(ne(T.read)*
se *orneste noul %ir de e,ecutie a+and ca *arametru te,tul ce trebuie trimis la ser+er:
ne(T.read.Start(signalText)*
Dar mai intai se inc!id toate t!read-urile ramase in sus*ensie de la +ec!ile incercari de dialog cu ser+erul.
Daca ser+erul nu ras*unde in tim* util? aceste %ire de e,ecutie raman sus*endate si ocu*a memoria in mod
abu6i+. Daca sunt mii de date de trimis si in tot acest tim* ser+erul nu ras*unde? sunt mii de t!read-uri
ramase in sus*ensie. De aceea trebuie %acuta curatenie din cand in cand:
%igura 0#& "nc<iderea irelor de e(ecutie inacti'e
Se creea6a o noua lista de t!read-uri in care sa +or sal+a toate %irele de e,ecutie care sunt inca acti+e.
Daca t!read-ul nu este acti+ se inc!ide *rin a*elul %unctiei bort@A. "a s%arsit lista de t!read-uri a clasei +a %i
initiali6ata cu noua lista? %iind alcatuita numai din %irele de e,ecutie acti+e.
1.!., Trimiterea datelor catre ser'er
'rimiterea e%ecti+a a te,tului catre ser+er se %ace in %unctia ce rulea6a in %irul de e,ecutie nou creat. ceats
%unctie urmea6a urmatorii *asi:
se obtine o instanta a clasei de biblioteca 'c*Client cu *arametrii: 8ser+er5P si 8*ortO
se obtine un obiect de ti* /#et9or-Stream/ *e care-l returnea6a acest 'c*Client. cest stream
*oate trimite octetii unul du*a altul *e canalul desc!is intre client si ser+er
des*ac!etam mesajul de ti* te,t intr-un sir de octeti ce *ot %i trimisi *e canalul de comunicatie:
7S"##Encoding encoding ' ne( 7S"##Encoding()*
+yte=> +$$er ' encoding.5et%ytes(signalText)*
Version no.: 1 Page (( o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
*elam %unctia stream.Erite *entru a trimite datele. ceasta %unctie /Erite/ lucrea6a ca si cum am
scrie intr-un %isier? *roblemele !ard9are de lo9 le+el de transmitere e%ecti+e a datelor %iind
trans*arente *entru noi ca utili6atori.
%igura 0,& -ialogul cu ser'erul
1.!.. %unctia -ispose inc<ide irele de e(ecutie suspendate
Daca utili6atorul inc!ide brusc a*licatia @cand inca sunt acti+e %ire de e,ecutie ce trimit date catre ser+erA
atunci trebuie a*elata o %unctie *e e+enimentul /DataPresentation)/orm"losing/ @deci cand %ereastra
este *e *unctul de a se inc!ideA care sa inc!ida toate resursele a%erente acestei a*licatii.
%igura 0.& Tratarea e'enimentului +%ormClosing+ in clasa +-ataPresentation+
Functia a*elata la inc!iderea a*licatiei *entru inc!iderea tuturor %irelor de e,ecutie a%erente clientului este
/Dis*ose@A/. Pentru a nu uita ca trebuie sa scrim aceasta %unctie? am mostenit clasa /'CPCommClient/ din
inter%ata /5dis*osable/ si ast%el? in mod automat VS-ul te obliga sa im*lemente6i %unctia Dis*ose@A:
Version no.: 1 Page (. o% ()
Programare Visual Studio .NET - LABORATOR
Project no. PVS 2008 Product name: Programare Visual Studio Date: Feb - 2010
Document no. Version no.: 0.1 CR no.: ut!or: "ucian #ita
%igura 00& Componentele interne ale clasei +TCPCommClient+
%igura 01& "nc<iderea irelor de e(ecutie la terminarea programului
4.2 !icetul TCPCommServer
cest obiect trebuie sa desc!ida un listener care sa rece*tione6e cererile de conectare de la clienti? sa
desc!ida canalele de comunicatie? sa rece*tione6e mesajele? sa des*ac!ete6e aceste mesaje si sa trimita
+alorile *rimite mai de*arte la /DataPresentation/.
Version no.: 1 Page () o% ()

S-ar putea să vă placă și