Szoftvertechnikák vizsga, 2008. május 30.
A VIK Wikiből
1. Mi az assembly / .NET szerelvény (assembly) fogalma, szerepe, típusai, azonosítása
lásd: 2007. június 13-i vizsga.
2. Mi az a delegate, mire használható. Példakód
lásd: 2007. június 6-i vizsga.
3. Mi az érvénytelen terület
Korábban takarásban levő, újra láthatóvá vált ablakrészek (pl.átméretezés, Z-orderben előbb került az ablak, stb.)
4. Szálkezelés...
a) C# szálvédelmi lehetőségei, szálvédős c# példa
1.) Kritikus szakasz: A kritikus szakaszt egyszerre csak egyetlen szál futtathatja, a többinek ilyenkor várakoznia kell. Kritikus szakaszt alkalmazó osztályok: Interlocked, Monitor, Mutex, és a ReaderWriterLock Zárolási konstrukciók: lock (nyelvi elem, Monitorral megegyező működésű), Monitor, Mutex, Semaphore, ReaderWriterLock, Interlocked Lock példa: class ThreadSafeClass{ static bool done; // Közös erőforrás static object syncObject = new object(); static void Main(){ new Thread(Run).Start(); new Thread(Run).Start(); } static void Run(){ lock (syncObject){ if (!done){ done = true; Console.WriteLine("Done"); } } } } 2.) Esemény: Az esemény olyan szinkronizációs eszköz, melynek írása és olvasása az ütemező által nem megszakítható, és processzortakarékos módon lehet rá várakozni. Az esemény kétféle állapotban lehet, jelzett és jelzetlen állapotban. Tehát az esemény egy speciális logikai változóként képzelhető el. A keretrendszer ezt megvalósító osztályai az AutoResetEvent, és a ManualResetEvent. A következő példában egy előtérszálat fogunk leállítani eseményre történő várakozással. AutoReset példa: class EventTestClass{ private static AutoResetEvent stopEvent = new AutoResetEvent(false); public static void Main(string[] args){ Thread t = new Thread(new ThreadStart(ThreadMethod)); t.Start(); } public static void ThreadMethod(){ while (!stopEvent.WaitOne(0, false)){ ... } } } 3.) Egy osztályt két szinten lehet szálbiztossá tenni: objektum és osztály szinten. a.) Az objektumszint esetén azt biztosítjuk, hogy az osztály adott objektuma legyen többszálú környezetben biztonságosan használható. A védelemre egy közönséges tagváltozót használunk (ilyen a private object syncroot = new object();) b.) Az osztályszint esetén az osztály valamennyi objektumára vonatkozóan biztosítjuk a védelmet. A statikus tagváltozók védelmét pl. csak így lehet megoldani. Ez esetben zárolási objektumként egy statikus tagváltozót kell használni. Pl.: private static object syncroot = new object(); Ez az objektumszintnél korlátozottabb párhuzamosítást engedélyez, hiszen a zárolási objektum (syncroot) az osztály minden objektumára közös. 4.) Formok: A vezérlőelemek alapvetően nem szálvédett objektumok, ami azt jelenti, hogy csak a létrehozó szálból lehet az állapotukat megváltoztatni. Ha nem a megfelelő szálból próbáljuk a vezérlőelemeink állapotát változtatni, akkor kivétel keletkezik. InvokeRequired: igaz, ha nem a vezérlőelemet létrehozó szálból kérdezzük le az értékét, egyébként hamis Invoke: a vezérlőelemet létrehozó szálon futtatja le a paraméterként megadott metódust private delegate void SetTextMethod( string text ); private void SetTextBoxText( string text ){ if (InvokeRequired){ Invoke(new SetTextMethod(SetTextBoxText), new object[]{text}); } else textBox1.Text = text; }
b) kell-e a következőknél szálvédelmet alkalmazni:
1) Függvények lokális változóira.
nem
2) Dinamikusan a heap-en allokált objektumokra.
igen
5. Linux vagy Windows példa a dinamikus programkönyvtárak betöltésére
lásd: 2007. június 13-i vizsga.
6. Tervezési minták...
a) Miben és hogyan segítenek a tervezési minták?
b) Composite tervezési minta, mi az, mire jó, hogy épül fel, példával vagy konkrétan a működése
lásd: 2007. május 30-i vizsga.
7. MVC vs. Document/View. Jellemzés, leírás, mi a különbség a kettő között, példa az egyikre
lásd: 2007. június 6-i vizsga.