Documente Academic
Documente Profesional
Documente Cultură
NET - LABORATOR
Project no.
Document no.
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Programare Microsoft
Visual Studio .NET
Lucrari de laborator
Version no.: 1
Page 1 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Cuprins
INTRODUCERE......................................................................................................................................................4
PREZENTAREA DATELOR................................................................................................................................15
4.1
SOLUTII CU PROIECTE MULTIPLE. IERARHIZAREA PROIECTELOR......................................................................15
4.2
FEREASTRA OUTPUT.........................................................................................................................................16
4.3
PROGRAMARE BAZATA PE EVENIMENTE. OBIECTELE "DELEGATE" SI "EVENT"...............................................17
4.4
PREZENTAREA DATELOR IN DATAGRID.............................................................................................................19
4.4.1
Controalele de tip GUI nu sunt thread-safe.............................................................................................21
4.5
CONTROALE VIZUALE: CHECKBOX, TEXTBOX. CLASA DICTIONARY..............................................................23
Version no.: 1
Page 2 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Lista de figuri
Figura 1: Visual Studio apare ca devenv.exe in lista de procese din Task Manager.......................................5
Figura 2: Crearea unui nou proiect de tip "Console Application" in Visual Studio .NET..................................6
Figura 3: Principalele ferestre de lucru ale mediului Visual Studio..................................................................7
Figura 4: Clasa "SensorBase" si enumerarea "SensorType"..........................................................................9
Figura 5: Constructorii clasei SensorBase.................................................................................................... 10
Figura 6: Selectarea unei valori dintr-o enumerare.......................................................................................10
Figura 7: Instantierea clasei "SensorBase" folosind constructorul implicit.....................................................11
Figura 8: Constructorii clasei PumpSensorValues........................................................................................ 12
Figura 9: Functia de generare si afisare a valorile aleatoare pentru senzori.................................................13
Figura 10: Intantierea clasei "PumpSensorValues" si pornirea ceasului.......................................................13
Figura 11: Selectarea unui proiect ca referinta pentru proiectul curent.........................................................15
Figura 12: Lansarea in executie a functiei de simulare a senzorilor..............................................................16
Figura 13: Fereastra Output afiseaza mesajele trimise la consola................................................................16
Figura 14: atasarea functiei "bTest_Click" la evenimentul "bTest.Click"........................................................17
Figura 15: Definirea obiectelor de tip delegate si event in clasa de generare a datelor de masurare...........17
Figura 16: Lansarea evenimentului "newSensorValueEvent".......................................................................18
Figura 17:Atasarea functiei "OnNewSensorValueHandler" la evenimentul "newSensorValueEvent"............18
Figura 18:Valorile primite prin eveniment de la clasa "PumpSensorValue" sunt afisate in MessageBox......19
Figura 19: Controlul DataGridView din ToolBox............................................................................................ 19
Figura 20:Setarea sursei de date pentru gridul de afisare............................................................................20
Figura 21: Popularea listei sensorValueList si setarea ei ca DataSource pentru grid...................................21
Figura 22: Eroare: un alt thread acceseaza datagridul.................................................................................21
Figura 23: Fereastra principala de prezentare a datelor cu datagrid-ul legat la lista de valori......................23
Figura 24: Adaugarea codului de pacient in clasa cu valorile senzorilor.......................................................24
Figura 25: Patient code trebuie adaugat si in clasa PumpSensorValues......................................................24
Figura 26: Evenimentul "newSensorValueEvent" include si codul de pacient...............................................24
Figura 27: Adaugarea coloanei PatientCode in datagrid...............................................................................25
Figura 28: Fereastra DataPresentation cu butoanele de startare si oprire a monitorizarii............................25
Figura 29: Enumerarea ce include codurile de pacienti................................................................................26
Figura 30: Atasarea unei enumerari la un CheckBox....................................................................................26
Figura 31: Codul aferent butonului "Start Monitoring"...................................................................................26
Figura 32: Functia StartPumping cu parametrii cod pacient si perioada de timp..........................................27
Figura 33: Oprirea monitorizarii pentru un pacient si eliminarea lui din dictionarul pacientilor activi.............28
Figura 34: Crearea bazei de date PatientData in SQLite Administrator......................................................30
Figura 35: Crearea tabelului PatientData pentru salvarea datelor ce vin de la pacienti..............................31
Figura 36: Adaugarea proiectului DataStore de tip Class Library la solutie..............................................32
Figura 37: Definirea string-ului de conectare la baza de date SQLite in pagina de proprietati a proiectului. 33
Figura 38: Functia de inserare a unei valori de masurare in baza de date...................................................34
Figura 39: Tratarea evenimentului newSensorValueEvent: salvare in baza si afisare in datagrid..............35
Figura 40: Comanda SQL de vizualizare a datelor din tabela PatientData...................................................35
Figura 41: Vizualizarea datelor din baza in SQLite Administrator.................................................................35
Figura 42: Fereastra DataPresentation dupa ce s-a adaugat sectiunea de filtrare......................................36
Figura 43: Functia de citire din baza de date a datelor de masurare pentru un pacient si o zi stabilita........37
Figura 44: Proiectul CommonReferences contine toate definitiile particulare ale tipurilor de date.............38
Figura 45: Afisarea valorilor din baza de date............................................................................................... 39
Figura 46: Functia handler pentru butonul Display Received Data.............................................................39
Version no.: 1
Page 3 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
1 Introducere
Scopul lucrarilor de laborator prezentate in acest document este de familiariza studentul cu mediul de
programare Visual Studio .NET si aplicarea practica a cunostintelor prezentate la curs.
In acest scop, se propune in cele ce urmeaza realizarea unei miniaplicatii numite "HealthMonitor" care sa
monitorizeze de la distanta starea unui pacient cu probleme de sanatate, in sensul ca pacientul poate sa
ramana acasa purtand cu el diversi senzori de masurare a bio-parametrilor (temperatura, ritm cardiac,
glicemie, etc) si aceste valori sunt trimise prin internet la cabinetul doctorului care urmareste astfel starea
pacientului si se deplaseaza numai la aparitia unei alarme.
Ce presupune aceasta monitorizare?
Citirea parametrilor bio
Salvarea valorilor masurate intr-o baza de date locala
Transmisia valorilor la aplicatia ce ruleaza in cabinetul doctorului
Afisarea acestor valori sub forma grafica sau text pentru ca doctorul sa poata trage concluziile
corecte referitoare la starea de sanatate a pacientului
Prin implementarea acestor taskuri, studentul va trebui sa-si insuseasca si sa lucreze cu urmatoarele
concepte:
Definirea claselor in OOP
Instantierea claselor
Mostenire
Controale grafice
Salvarea datelor in baza de date
Comunicatii TCP/IP
Multithreading
Programare bazata pe evenimente
...
Evident ca aceste concepte nu pot fi acoperite in totalitate intr-un numar atat de mic de ore, dar acest
exemplu poate reprezenta un punct de plecare pentru dezvoltarea de alte aplicatii serioase si aprofundarea
cunostintelor legate de programare obiect si Visual Studio .NET.
Version no.: 1
Page 4 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 1: Visual Studio apare ca devenv.exe in lista de procese din Task Manager
Dupa lansarea VS, primul pas este de a deschide un proiect deja existent pe dicul local, sau putem crea un
nou proiect (meniul File/New/Project..")
Version no.: 1
Page 5 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 2: Crearea unui nou proiect de tip "Console Application" in Visual Studio .NET
Putem alege din mai multe tipuri de proiecte, dupa cum urmeaza:
Windows Form application: este pentru dezvoltarea de aplicatii de tip GUI, bazate pe ferestre,
controale grafice, etc.
WPF Application: dezvolta acelasi tip de aplicatii de tip GUI, dar bazate pe noua tehnologie WPF
(Windows Presentation Foundation) ce expune posibilitati mult mai largi de desenare grafica a
interfetelor utilizator. WPF lucreaza cu limbajul XAML prin care se pot descrie imagine grafice de pe
ecran. Folosind acest limbaj, utilizatorul are posibilitatea sa deseneze interfata grafica intr-o
aplicatie specifica de desenare, exporta imaginea in format XAML si aceasta se importa in Visual
Studio unde i se poate atasa evenimente si logica necesara aplicatiei.
Console Application: cel mai simplu proiect, nu are interfata grafica, este foarte util in testarea
rapida a unor concepte de tip OOP.
Windows Service: dezvoltarea unui serviciu Windows. Serviciile sunt acele aplicatii care pornesc
automat la deschiderea calculatorului si ofera suport in background pentru diverse functionalitati ale
sistemului. De exemplu, baza de date Oracle lucreaza ca un serviciu, porneste odata cu sistemul si
deschide un "Listener" ce asculta in mod permanent la un port pentru a raspunde eventualelor
comenzi SQL trimise de un client.
Proiecte de tip "Library": nu au interfata cu utilizatorul, nu pot fi pornite direct pentru ca nu contin
functia "Main". Ele sunt folosite doar pentru crearea diverselor functii de biblioteca ce vor fi utilizate
in programele de tip "application". Librariile sunt salvate pe disc sub forma de fisiere DLL ce trebuie
importate in spatiul de lucru al proiecteor ce vor face apel la ele.
Version no.: 1
Page 6 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 7 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 8 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 9 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 10 of 46
PVS 2008
Document no.
o
o
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Sa se defineasca un alt obiect de tip "SensorBase", dar utilizand de data aceasta constructorul cu
parametri
Sa se afiseze valorile acestui obiect prin apelul functiei "DisplaySensorValue()".
Intrebare: de ce a fost necesar sa se declare functia "DisplaySensorValue()" de tip static? Stergeti
atributul "static" din definitia functiei si observati rezultatul.
Version no.: 1
Page 11 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
In folderul "Sensor" se creeaza o noua clasa numita "PumpSensorValues". Aceasta va avea doar un singur
constructor public, cel ce primeste numarul de secunde intre doua valori ale senzorilor.
Version no.: 1
Page 12 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 13 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 14 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
4 Prezentarea datelor
4.1 Solutii cu proiecte multiple. Ierarhizarea proiectelor
Pana acum am reusit sa generam date pentru senzorii de masurare si sa le afisam in fereastra de tip
consola. Dar acest tip de afisare nu este convenabila pentru doctor. Doctorul ar avea nevoie de un ecran
care sa-i afiseze valorile sosite continuu de la senzor, sa le poata sorta dupa tipul de senzor, sa-i fie
semnalate alarme in cazul unei valori ce depaseste anumite limite.
In acest scop vom dezvolta un nou proiect de tip Windows Form Application care va avea drept scop
afisarea intr-o maniera grafica a rezultatelor de masurare.
Mai intai, se redenumeste solutia in "HealthMonitor" (click dreapta pe numele solutiei si alegem meniul
"Rename"), iar proiectul TestOOP se redenumeste "SensorInput". Deci ne propunem o solutie pentru
monitorizarea starii de sanatate a pacientului, iar in cadrul acestei solutii proiectul deja construit are rol de a
simula functionarea reala a senzorilor.
Se deschide un nou proiect in cadrul solutiei pentru prezentarea datelor venite de la senzori. Acest nou
proiect se denumeste "DataPresentation" si se alege sa fie proeictul de pornire a solutiei. Cand o solutie
contine mai multe proiecte trebuie ales proiectul de pornire, cel ce va lansa functia Main().
Acest nou proiect trebuie sa afiseze datele furnizate de celalalt proiect (SensorInput). Totusi, proiectele sunt
independente si nu se pot apela in mod direct functii dintr-un proiect in altul. De aceea,trebuie alcatuita o
ierarhie de proiecte, in care un proiect poate face apel la clasele dintr-un alt proiect aflat pe o ramura
inferioara in cadrul ierarhiei. Includerea unui proiect copil in cadrul ierarhiei se face prin adaugarea acelui
proiect la referintele proiectului tata. Se face click dreapta pe "References" la proiectul "DataPresentation"
si se alege Add Reference:
Version no.: 1
Page 15 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 16 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 15: Definirea obiectelor de tip delegate si event in clasa de generare a datelor de masurare
Intai se defineste delegatul in afara oricarei clase. Este ca orice definitie de functie, numai ca i se pune in
fata termenul "delegate". In acest fel se defineste amprenta functiei care trebuie sa prinda evenimentul.
Evenimentul se declara in interiorul clasei si trebuie sa fie public pentru a fi cunoscut si in afara clasei.
Lansarea acestuia se face simplu, este ca un apel de functie:
Version no.: 1
Page 17 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 18 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 19 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 20 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 21 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
pentru acea aplicatie si-i da drumul sa ruleze. In acest fel se aduna mai multe fire de executie, toate cerand
timp microprocesor pentru executie. In functie de prioritatea lor, Windows-ul le acorda la fiecare un timp
microprocesor in care acel thread sa-si faca treaba. Deci microprocesorul porneste un thread, apoi il
opreste si da microprocesorul la alt thread, apoi la altul, apoi se intoarce iar la primul si tot asa.
Acelasi multithreading se intampla si-n aplicatia noastra. Clasa PumpSensorValues are o functie de pornire
a ceasului:
public void StartPumping()
{
timerBase.Start();
}
Aceasta functie aparent nevinovata de fapt creeaza un alt thread in care va lucra ceasul. Ceasul este un
obiect ce lucreaza in background si nu are sens sa ocupe din threadul curent de executie. El isi deschide
un thread separat de unde trimite din cand in cand evenimente de tip "Time_Elapsed".
Tehnica programarii de tip multithreading este foarte utila atunci cand trebuie indeplinite taskuri mari
consumatoare de timp: download-area unui fisier mare de pe internet, accesul la o baza de date,
deschiderea de fisiere mari, etc. Daca aceste taskuri s-ar executa in acelasi fir de executie cu cel pricipal ce
raspunde de interfata cu utilizatorul, atunci aceasta interfata ar fi inghetata (froozen) pe timpul rularii lor.
Adica programul nu mai raspunde la nici o actiune a utilizatorului deoarece este captiv in acel task lung. De
aceea se prefera ca acel task se porneasca pe un alt thread, iar threadul principal sa ramana activ pentru a
raspunde la comenzile utilizatorului, si cand threadul secundar se termina, sa trimita un eveniment catre
threadul principal.
Cam asa lucreaza si Timer-ul, el ruleaza pe un thread secundar de unde trimite evenimente catre threadul
nostru principal: cel ce afiseaza fereastra si raspunde la butoane. Toate bune si frumoase pana cand
threadul secundar arunca un eveniment, acesta este prins intr-o functie si acea functie vrea sa acceseze
datagrid-ul (sau orice alt control vizual din fereastra). In acel moment apare eroarea descrisa mai sus,
deoarece controalele vizuale nu sunt "thread-safe", adica nu lucreaza bine pe mai multe fire de executie.
Nici nu au cum daca ne gandim ca threadurile lucreaza intretesut, adica se intrerup unul pe altul in mod
permanent. Si se pot intampla situatii cand un thread modifica culoarea la un control in verde de exemplu si
este intrerupt in acest timp de un alt thread care modifica in rosu. Ce culoare ar trebui sa aiba controlul la
sfarsit? De aceea s-a hotarat ca toate controalele vizuale nu lucreaza multithreading si nu accepta controlul
decat de la threadul care l-a instantiat.
Pentru a sari in threadul principal din threadul secundar, apelam functia BeginInvoke, care pune in coada
de mesaje al threadului principal functia ce trebuie executata. Este aceeasi functie
"BindDataGridToListOfValues", dar prin apelul BeginInvoke eu o trimit spre executie thread-ului
principal. Fiind executata de thread-ul principal, se paote umbla la controlul datagrid si sa-i setam
DataSource pe lista de valori obtinuta in celalalt thread.
private void BindDataGridToListOfValues()
{
dgSensorValueList.DataSource = null;
dgSensorValueList.DataSource = sensorValueList;
}
Deci, la fiecare eveniment primit de la celalalt thread, eveniment ce vine dupa el cu o noua valoare de
senzor, noi adaugam in lista acea valoare si reconectam lista la datagrid pentru afisare.
Version no.: 1
Page 22 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 23: Fereastra principala de prezentare a datelor cu datagrid-ul legat la lista de valori
Version no.: 1
Page 23 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 24 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 25 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 26 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 27 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 33: Oprirea monitorizarii pentru un pacient si eliminarea lui din dictionarul pacientilor activi
In sfarsit am obtinut ceva... un grid care se incarca periodic cu o noua linie ce afiseaza ultima masuratoare
obtinuta de la senzori aferenti unui pacient activ, putem de asemenea starta sau stopa monitorizarea unui
pacient cu o perioada de timp programabila.
Totusi treaba nu e gata, mai trebuie lucrat la interfata (butoane de filtrare a informatiei, alarme, etc) cat si
alte taskuri ramase in aer:
Salvarea datelor intr-o baza de date (ce ne facem daca doctorul vrea sa vada valorile de
acum o saptamana si noi am pierdut lista de valori?)
Comunicare TCP/IP intre PumpSensorValues si datagrid (sa nu uitam ca in principiu,
pacientul sta acasa si PumpSensorValues ruleaza la pacient acasa, pe cand
DataPresentation ruleaza la doctor in cabinet, deci pe calculatoare diferite).
Si altele...
Version no.: 1
Page 28 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 29 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 30 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 35: Crearea tabelului PatientData pentru salvarea datelor ce vin de la pacienti
In afara de cele patru campuri de valori ce vin de la pacient se mai adauga un camp numit id de tip varchar
si care va fi coloana de tip primary key pentru acest tabel. Tabelul se mai poate crea si prin instructiunea
SQL specifica:
CREATE TABLE [PatientData] (
[id] VARCHAR(16) PRIMARY KEY NULL,
[patient_code] VARCHAR(10) NULL,
[sensor_type] VARCHAR(20) NULL,
[timestamp] DATE NULL,
[value] NUMERIC NULL
)
5.2 Data Acquisition Layer : interfata intre baza de date si aplicatia GUI
Nu este indicat sa se acceseze direct baza de date din functiile ce apartin de clasa GUI. Conexiunea la
baza de date, functiile SQL, trebuie sa fie create pe un nivel intermediar, de sine statator si care va fi apelat
de clasa superioara de tip GUI pentru orice accesare a bazei de date.
Adaugam un nou proiect la solutie, dar de data aceasta de tip Class Library (deci un simplu fisier DLL,
fara nici o interfata cu utilizatorul), pe care-l denumim DataStore:
Version no.: 1
Page 31 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 32 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 37: Definirea string-ului de conectare la baza de date SQLite in pagina de proprietati a
proiectului
Se pune numele proprietatii ConnStringSQLite, se alege la Type tipul resursei Connection String, iar la
value se da click pe butonul
pentru a defini conexiunea cu ajutorul Wizard-ului. Se deschide Wizard-ul
si se selecteaza la DataSource driver-ul .NET Framework Data Provider for SQLite, iar la DataBase se
merge cu butonul Browse si se selecteaza fisierul creat pentru baza de date. La sfarsit se poate face si un
test de verificare daca conexiunea este setata corect (butonul test Connection).
Version no.: 1
Page 33 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Trebuie observat ca accesul la baza de date s-a facut prin constructia try-catch-finally pentru a ne asigura
ca tratam eroarea aparuta in cazul cand baza de date nu raspunde.
Tot ce mai ramane de facut este de a apela functia de salvare in baza de date in momentul cand proiectul
DataPresentation primeste o noua valoare de masurare prin evenimentul newSensorValueEvent:
Version no.: 1
Page 34 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 35 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 36 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 43: Functia de citire din baza de date a datelor de masurare pentru un pacient si o zi stabilita
Functia de citire din baza de date are urmatoarea structura:
se creeaza o noua lista sensorValueList unde vor fi salvate informatiilor gasite in baza
se defineste un nou obiect de tip SQLiteConnection si un obiect SQLiteCommand
se scrie instructiunea SQL de selectie din baza de date si se ataseaza obiectului SQLiteCommand
se adauga parametrii de filtrare: patient_code, minTime si maxTime
se deschide un SQLiteReader in care se salveaza toate liniile aduse din baza de date de fraza
select (reader = cmd.ExecuteReader();).
Se parcurge reader-ul linie cu linie, se face conversia datelor aduse de fraza select la tipul
SensorBase si se adauga noul item la lista de valori.
La sfarsit se inchide conexiunea, reader-ul si se returneaza lista de valori.
Totusi avem o mica problema: proiectul DataStore nu cunoaste tipul de date PatientCodeEnum cu care
trebuie sa lucreze functia GetData pentru ca aceasta enumerare este definita in proiectul
Version no.: 1
Page 37 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 44: Proiectul CommonReferences contine toate definitiile particulare ale tipurilor de date
Am mutat definitiile PatientCodeEnum si SensorType in CommonReferences astfel incat acestea sa fie
vizibile in toata solutia fara probleme de referinta circulara.
Tot ce mai ramane pentru vizualizarea datelor din baza de date e sa implementam codul pentru butonul
Display selected Data:
Version no.: 1
Page 38 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 39 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Figura 47: Proiectul Data Presentation cu posibilitatea de a alege canalul de comunicare a datelor
Version no.: 1
Page 40 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 41 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
"SendSignalData" ce primeste cele patru valori din clasa SensorBase in scopul trimiterii lor catre
server.
Version no.: 1
Page 42 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
6.1.2 Crearea unui nou fir de executie pentru fiecare dialog cu serverul
Functia ce trimite efectiv mesajul text catre server este listata in continuare:
Version no.: 1
Page 43 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
myThreadList.Add(newThread);
se porneste noul fir de executie avand ca parametru textul ce trebuie trimis la server:
newThread.Start(signalText);
Dar mai intai se inchid toate thread-urile ramase in suspensie de la vechile incercari de dialog cu serverul.
Daca serverul nu raspunde in timp util, aceste fire de executie raman suspendate si ocupa memoria in mod
abuziv. Daca sunt mii de date de trimis si in tot acest timp serverul nu raspunde, sunt mii de thread-uri
ramase in suspensie. De aceea trebuie facuta curatenie din cand in cand:
Version no.: 1
Page 44 of 46
PVS 2008
Document no.
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Apelam functia stream.Write pentru a trimite datele. Aceasta functie "Write" lucreaza ca si cum am
scrie intr-un fisier, problemele hardware de low level de transmitere efective a datelor fiind
transparente pentru noi ca utilizatori.
Version no.: 1
Page 45 of 46
PVS 2008
Product name:
Date:
Feb - 2010
Version no.:
0.1
Author:
Lucian Nita
CR no.:
Version no.: 1
Page 46 of 46