SzoftTechPZH20130510

A VIK Wikiből

1.: a) UML (6p)

b) (csonk) Nagy projektekben c# nyelvű környezetben a feladatunk egy Document-View architektúrájú alkalmazás alapjainak elkészítése. Az architektúra egyik alapgondolata, hogy a dokumentum(Document) objektum egy listában tartja nyilván a nézeteit(View) különböző típusúak lehetnek (pl DrawingView, Editorview). A nézeteknek vannak tulajdonságaik (pl Size) és műveleteik (pl SetSize). Vannak, amik elérnek. (eddig emlékszem)


2.: A person osztály egy Age nevű, integer típusú publikus tulajdonsággal (property) és egy szintén nyilvános, AgeChanged eseménnyel rendelkezik. Ha Age-t megváltoztatjuk, az elsüti az AgeChanged Eseményt, melynek argumentumaiban megadja az Age tulajdonság korábbi és új értékét is.

Adjuk meg a Person osztály teljes kódját C# nyelven, és írjunk hozzá példakódot a használathoz.

    
    public delegate void ChangedDelegate(int x, int y);

    public class Person
    {
        public event ChangedDelegate AgeChanged;
        private int age;

        public Person(int age)
        {
            this.age = age;
        }

        public int Age
        {
            get { return age; }
            set
            {
                AgeChanged(age, value);
                age = value;
            }
        }            
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person jakab = new Person(25);
            jakab.AgeChanged += eventHandler;

            jakab.Age = 30;
        }

        static void eventHandler(int regi, int uj)
        {
            Console.WriteLine("Age régi értéke: {0}", regi);
            Console.WriteLine("Age új értéke: {0}", uj);
        }
    }

3.: a) Milyen célt szolgál a Partial class?

Segítségével több fájlba szétszedhető az osztály definíciója.

Csak .NET 2.0-tól elérhető nyelvi elem.

A fordító fésüli össze (nem lehetnek a részek külön szerelvényben).

Példa: WinForms használatánál a generált és a kézzel írt kód különválasztása.

b) Component és Control osztályok közti különbség?

  • Component (komponens):

Bármilyen, container (pl. designer) által tartalmazható komponens. Nem feltétlenül vizuális (pl. Timer, SerialPort), de fel lehet dobni a designerbe, megadhatók vizuálisan a tulajdonságok és események

  • Control (vezérlő):

A Component-ből származik. Minden vezérlő őse. Natív ablak HWND tartozik hozzá (Handle tulajdonság). Összes közös tulajdonság, összes közös művelet, összes közös esemény

c) (10,10)-be zöld színű, 1 px vastag vonallal rajzolt, kitöltetlen, 30px oldalhosszú négyzetet rajzoljunk. A vonal színe 10 mp alatt menjen át fehérbe. 'Interruptolj' az x gombbal. Csak időzítő (Timer) alapú megoldás elfogadható.

    public partial class Form1 : Form
    {
        bool stopped = false;
        int cntr = 0;

        public Form1()
        {
            Timer timer = new Timer();
            timer.Interval = 1000;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();

            this.KeyDown += new KeyEventHandler(Form1_Keydown);

            InitializeComponent();
        }

        void Form1_Keydown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.X && !stopped)
                stopped = true;
        }

        void timer_Tick(object sender, EventArgs e)
        {
            if (!stopped)
                Invalidate();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Pen pen = new Pen(Color.FromArgb(5 + cntr * 25, 255, 5 + cntr * 25), 1);
            e.Graphics.DrawRectangle(pen, 10, 10, 30, 30);

            if (cntr == 10)
                stopped = true;

            if (!stopped)
                ++cntr; 
        }
    }


4.:a) C# példa Dispose kapcsán using blokk használatára + magyarázat a kódhoz (6p)

using(NativeWrapperPelda nw = new NativeWrapperPelda()) // NativeWrapperPelda implementálja az IDisposeable-t
{
    nw.SomeMethod();
    ///...
}//itt meghívódik az nw.Dispose()

b) Felügyelt .NET környezetben miért ne férjünk egy obj destruktorában a felügyelt tagváltozókhoz? (3p)

A destruktor csak a külső hivatkozásait engedhesse el(pl. nem felügyelt erőforrások) , mert a felügyelteket lehet, hogy felszabadította már a GC.

c) natív C++ template-ek 3 negatív tulajdonsága, mely C#-ból eltűnt (3p)

  • Ha nem használunk egy sablont, ki se derülnek a benne levő hibák c++ban.
  • Kódburjánzás (code bloat) veszély eltűnt.
  • A sablon önmagában, a paraméterek megkötése nélkül is lefordul. A forráskód védelme megoldott.

5.: Szálkezelés:

a) Többszálú alk. előnyei (4p)

  1. jobb processzor kihasználtság
  2. nem növekvő átlagos válaszidő (interaktivitás – pl. nem akad le a GUI, szerveralkalmazások)
  3. időzítés érzékeny feladatok magasabb prioritású szálon futtathatóak

b) Itt el kellett indítgatni két szálat meg megállítani őket..

c) Mely esetben használunk ill nem használunk statikus blokkot (3p)

6.: Csővezeték architektúra

a) Adatnyelő által vezérelt csővezeték architektúra ismertetése szekvenciadiagrammal (8p)

b) (írj) Pszeudo-kódot szűrő (filter) komponens megvalósításához adatnyelő által vezérelt csővezeték architektúrában(6p)

7.: ADO.NET

Írjunk robosztus, hatékony, kapcsolat alapú modellre épülő ADO.NET példakódot, amely kitöröl minden olyan rekordot, melyben létezik a DepartmentID.

Staff(StaffID(kulcs), Name, EMail, DepartmentID). (13p)

SqlConnection conn = null;

try
{
conn = new SqlConnection("...");
SqlCommand command = new SqlCommand("DELETE FROM Staff WHERE DepartmentID IS NOT NULL", conn);
conn.Open();
command.ExecuteNonQuery();
}
catch(EXception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (conn != null) conn.Close();
}


  • A szálkezelős feladat ha jól emlékszem hasonló volt a rendes ZH A csoportjának a feladatához: megírt kód elindít két szálat: egyik szál egy long (64bites!!!) változóbe beír egy számot, majd a másik szál kiolvassa és kiírja a konzolra. az egyes szál a beírás után, a kettes szál a kiolvasás után befejezheti a futását. Az nem tételezhető fel hogy az egyes szál előbb indul el mint a kettes!