Program delegate Kommunikasjon mellom objekter er en utfordring i objektorientert programmering. Dette GUI eksempelet viser hvordan bruke en delegate til å gjøre metodekall i et annet objekt. Vi skal legge en klasse på en egen fil med en metode som er en tråd. Denne tråden skal skrive ut tall i labellen på formen. Dette innebærer at tråden må kunne kommunisere med labellen i klassen Form1. For å få til dette bruker vi en delegate. Lage et nytt prosjekt i Visual Studio 1. Start Visual Studio 2. Velg Create: Project 3. Du får opp en dialogboks. Velg Project type: Visual C++ og CLR Template: Windows Form Application 4. Skriv navn på prosjektet Name: delegategui 5. Gi katalog prosjektet skal ligge Location: c:\projects
Lage formen Lag en form med følgende utseende. På formen legges en labell og en button. Lage en metode for knappen Dobbeltklikk på knappen på formen. Det blir nå knyttet en metode til knappen som heter button1_click() Lage en metode som kalles når formen avsluttes Når programmet avsluttes må tråden også avsluttes. Hvis ikke tråden avsluttes fortseter den å være i minnet helt til datamaskinen skrues av. Så lenge tråden er i minnet kan vi ikke kompilere programmet på ny. Gå tilbake til formen ved å klikke på tabben Form1.h[Design]*. Klikk på formen med venstre mustast for å få fram Properties for Form1. Klikk på Events knappen øverst på Properties (gult lyn). Dobbeltklikk på FormClosing (under Behavior). Du har nå fått en metode som kalles når programmet avsluttes private: System::Void Form1_FormClosing( )
Lage en klasse med tråden Vi skal nå lage en klasse med tråden. Denne klassen skal ligge på en egen fil. Gå på menyen i Visual Studio og velg Project Add New Item I dialogboksen velg Visual C++ Code Header File (.h) Gi filen navn Name: Traad.h Legg følgende kode på filen Traad.h //////////////////////////////////////////////////////////// //Kode på filen Traad.h #include "stdafx.h" using namespace System; using namespace System::Threading; public ref class Traad public: delegate void utskriftdelegate(int); // Har deklarert en delegate. // void angir at metoden ikke returnerer noe. // int angir at metoden har en parameter som er integer. static utskriftdelegate^ utskrift; // Delarerer en peker av typen utskriftsdelegate. // delegate objektet opprettes i initialiser() på Form1.h public: static void traadfunk() // Metoden til tråden. // Denne metoden skriver ut tall i labellen på formen. int teller = 0; while(true) Thread::Sleep(500); // Venter 0.5 sekund
; try utskrift(teller++); // Kaller delegaten catch (Exception^ ) // hvis ikke får tak i label1 Legge en include på filen Form1.h For at programmet på filen Form1. h skal kunne nå koden på Traad.h må filen inkluderes. Legg følgende include øverst på filen Form1. h #pragma once // fra før #include "Traad.h" Kode nederst i class Form1 på filen Form1.h Legg følgende kode nederst i class Form1 på filen Form1.h Start etter pragma endregion. #pragma endregion // fra før /////////////////////////////////// Traad^ traadobj; Thread^ traad; private: void initialiser() // Lager et nytt tråd objekt traadobj = gcnew Traad(); // kalles fra konstruktøren til Form1 // Lager delegaten i objektet traadobj traadobj->utskrift = gcnew Traad::utskriftDelegate(this, &Form1::utskrift); private: void utskrift(int teller) // Skriver ut variabelen teller i label1 label1->text = teller.tostring();
private: System::Void button1_click(system::object^ sender, System::EventArgs^ e) // Metoden til knappen. Her startes tråden. ThreadStart^ threaddelegate = gcnew ThreadStart(traadObj->traadFunk); traad = gcnew Thread(threadDelegate); traad->start(); private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) // Her fjernes tråden fra minnet. // Ellers går det ikke å endre koden og kompilere på ny // uten å restarte maskinen. traad->abort(); Kalle metoden initialiser() i konstruktøren Metoden initialiser() skal kalles i konstruktøren til Form1 (øverst på filen Form1.h). Føy til dette kallet nederst i konstruktøren. Form1(void) InitializeComponent(); // //TODO: Add the constructor code here // initialiser(); Kompilere og kjøre programmet Programmet er nå klart for uttesting. Trykk Ctrl + F5 for å kompilere og kjøre programmet. Klikk på knappen for å starte tråden.