0% au considerat acest document util (0 voturi)
52 vizualizări

Programare Visual Studio

Documentul prezintă laboratoarele pentru cursul de Programare Visual Studio .NET. Sunt prezentate mediul de programare Visual Studio, definirea claselor, prezentarea datelor în interfața grafică, salvare de date în baze de date și transmiterea de date între aplicații prin TCP/IP.
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
52 vizualizări

Programare Visual Studio

Documentul prezintă laboratoarele pentru cursul de Programare Visual Studio .NET. Sunt prezentate mediul de programare Visual Studio, definirea claselor, prezentarea datelor în interfața grafică, salvare de date în baze de date și transmiterea de date între aplicații prin TCP/IP.
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 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