ISU+Ov8

I denne øvelse skal vi arbejde med at sende beskeder imellem tråde hvor vi opretter en message class. Dette betyder at vi er nød til at benytte is af polymofi. Det smarte ved dette er at vi kan forenkle vores kode ved at vi nedarver klasser fra hinande, i dette tilfælde message som vil blive benytte både af sender og modtager. Af denne grund er vi nød til at lave Message som en basic klasse.

Koden der skal bruges for klassen Message og som alle beskeder nedarver fra: code class Message { public: virtual ~Message{} }; code destructoren bliver erklæret virtuel for at vi ikke kalder destruktoren for basisklassen men i stedet bruger destruktoren for det objekt vi behandler.
 * Del 1**
 * Hvorfor er det vigtigt at vores destruktor er virtuel**

I vores kø klasse skal der bruges en container til at lagre vores information, containeren skal være god til at kunne lave en kø derfor er det en fordel at vores STL container kan tage objekter ind og sende dem ud igen i kronologisk rækkefølge samtidigt er det en fordel at denne kan finde den første massage. For at løse denne opgave benytter vi os af STL. STL er en række standard skabeloner som mange har testet og udarbejdet. Vi kan gå ind på cplusplus.com for at læse om de forskellige. Vi søger en STL der har FIFO men også en søge funktion og så arbejder den med at søge efter den mappede value og key value.
 * hvilken STL container skal vi vælge til mores MsgQueue klasse**


 * del 2**

code void* send(void * data) {   point3D *  punkt1 = new point3D; punkt1-> x = 1; punkt1-> y = 2; punkt1-> z = 3; MQ.send(ID_POINT,punkt1); } code Her ses vores implementation af vores send funktion Vi opretter en instands af point3D og tildeler den værdier. code void* resive(void *data) {   size_t id; Message* msg_ = MQ.receive(id); if(id == ID_POINT) {       point3D* point = dynamic_cast (msg_); cout << point->x << endl; cout << point->y << endl; cout << point->z << endl; }   else {       cout << "error" << endl; }

delete msg_; }

code Dette er vores implementation af receive. Her kan det ses at det er denne funktion som nedlægger den gamle message.


 * Spørgsmål:**
 * 1) Normalt er det den som opretter som nedlægger objekter. I vores tilfælde er det dog receiver threaden som nedlægger da objektet ikke længere skal bruges når receiveren har haft fat i den. Da der er mere end én sender ville man resikere at de ville komme til at delægge hinandens instanser hvis det var dem som nedlagde objekterne.
 * 2) Om vi skulle lave programmet på en anden måde ville det være mere hensigtsmæssigt om det var queue som var ejer. Dette ville være tilfældet om vi skulle bygge et korrekt produkt.
 * 3) Ved at vi giver msgQueue som argumentet til trådene får disse kendskab til denne.
 * 4) Point3D nedarves fra class massage fordi vi ser point3D som en massage som bliver sendt rundt.

code struct point3D : Message {   int x;    int y;    int z; }; code


 * del 3**

i denne opgave reimplementerer vi PCLS opgaven fra tidligere vor vi tidligere blot styrede threadsne med signaler bruges der nu besked køer og statemashine prinsippet.

selve statemashinen bliver lavet ved at bruge cases disse cases aktiveres ud fra en række id der alle er lagt i en enumerated eller i c kode enum samling code enum { ID_ENTRY_OPEN_REQUEST, ID_ENTRY_OPEN_CONFIRM, ID_EXIT_OPEN_REQUEST, ID_EXIT_OPEN_CONFIRM, ID_WAITING_TO_ENTER,   ID_WAITING_TO_EXIT, ID_DONE }; code

fårdelen ved at vi implementerer koden ved hjælp af cases og statemachine er at vi har kan slippe for at bruge mutexes og conditions vi skal blot sende de rigtige id rundt til de forskellige funktioner. code Indkørsels anmodning modtaget Indkørsels anmodning modtaget Indkørsels anmodning modtaget bil køre ind i garage bil kører ud af garage udkørsels anmodning modtaget bil køre ind i garage bil kører ud af garage udkørsels anmodning modtaget bil køre ind i garage udkørsels anmodning modtaget bil kører ud af garage code

opgaven var til at starte med en svær opgave men efterhånden som man begyndte at danne sig et struktureret overblik over opgave og fik tegnet nogle ortendlige diagrammer viste opgaven sig at blive mere overskuelig, men der er ingentvil om at denne metode er en god og effektiv måde til at kommunikerer mellem threads.
 * konklusion**

void* send(void * data){ point3D * punkt1 = new point3D; punkt1-> x = 1; punkt1-> y = 2; punkt1-> z = 3; MQ.send(ID_POINT,punkt1);

}