.Net előadás jegyzet – 11. óra
1.oldal
Grafikus felhasználói felület 3.
Képek kezelése - PictureBox - létrehozás, rajzolás - mentés, betöltés Tegyünk fel egy PictureBoxot Ehhez hozzá tudunk rendelni egy img propertyn egy képet, de mi kódból csinájuk! pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
létrehozható üresen, vagy Szélesség magasság, vagy fileból, steamból… Üres! Nem rajzoltunk rá! Graphics = grafika rajzoljunk rá tollal egy vonalat, szín :fekete Image img = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics g = Graphics.FromImage(img); g.DrawLine(new Pen(Color.Black), 0, 0, img.Width, img.Height); pictureBox1.Image = img;
Fileba mentés: img.Save ("útvonal") formátum :Jpeg Betölteni:Img.FromFile("útvonal") Újabb image- régit ki kell törölni, mert a GC nem veszi rögtön ki és foglalja a memóriát. Hívjunk Disposet img.Save("x.png", System.Drawing.Imaging.ImageFormat.Png); //Image.FromFile("c:\\dotnet\\x.png");
Gombnyomásra betallózni a kép (útvnalát): using, hogy felszabaduljon, mikor lecsukjuk; showDialog; openFileDialog… using (OpenFileDialog openFileDialog = new OpenFileDialog()) { if (openFileDialog.ShowDialog() == DialogResult.OK) { MessageBox.Show(openFileDialog.FileName); } }
Szűrő: open FileDialog.Filer
.Net előadás jegyzet – 11. óra
2.oldal
Dupla pufferelés Mire jó: a képet programmal rajzoljuk, akkor folyamatosan frissíteni kell, és újra megjeleníteni a képen. Ezért egy másik helyen rajzoljuk meg inkább, és csak a végeredményt jelenítjük meg. Ez sokkal gyorsabb lesz, nem fog az állandó frissítés miatt villogni a kép, és a gépet sem terheli. Új Form using hogy felszabaduljon, mikor lecsukjuk modálisan megjelenítjük a dialógust pl: Sok vonalat akarok kirajzolni a Formra! Legyen a szín: r g b, koordináta: x1,x2,y1,y2, random! gr Pen Graphics gr = e.Graphics; Random rnd = new Random(); for (int i = 0; i < 10000; i++) { int r = rnd.Next(255); int g = rnd.Next(255); int b = rnd.Next(255); int x1 = rnd.Next(this.Width); int x2 = rnd.Next(this.Width); int y1 = rnd.Next(this.Height); int y2 = rnd.Next(this.Height); gr.DrawLine(new Pen(Color.FromArgb(r, g, b)), x1, y1, x2, y2); }
Lassú a kirajzolás! Vibrál a képernyő! Kirajzolja ablakot, majd feltöltődik - sok idő frissít a képernyő fehér háttérrel, majd megint kiírja. Jobb lenne hátsó pufferben összeállítani a képet és egybe kirakni. Dupla Pufferelés. A kész kép nem vibrál. DoubleBuffer=TRUE És még gyorsabb is. Nem minden vonallal a videokártyának szól. - régen: pl. SetStyle(ControlStyles.ResizeRedraw |ControlStyles.DoubleBuffer | ControlStyles.UserPaint|ControlStyles.AllPaintingInWmPaint, true); Ha .Net 1 akkor ilyen hosszú a kód, de mi .Net 2 es 1 property átállítása. using (frmDoubleBuffer frm = new frmDoubleBuffer()) { frm.ShowDialog(); }
.Net előadás jegyzet – 11. óra
3.oldal
Szálkezelés
Thread-ek Már volt BackgroundWorker és egy példa workedThread: OkosHatterMuveletHashKodszamito +++ if (workerThread == null) { workerThread = new Thread(new ThreadStart (OkosHatterMuveletesHashKodszamito)); workerThread.Start(); }
+++ (using System.Threading;) Szálindítás: Start queueReader.Start();
Szál megállítás: Abort, vagy Join- bevárni hogy a szál leálljon. Felfüggesztés és folytatás: firstThread.Suspend(); firstThread.Resume();
Felfüggesztés adott ideig: Thread.Sleep (Int32)
Szinkronizáció Szinronizáció legprimitívebb módszere : Busy Waiting – amíg nem kap üzenetet addig végtelen ciklus fut, újra és újra ellenőrzi volt-e üzenet. Rossz. Nem hatékony. Ha többen akarnak egyszerre üzenni akkor ez nem is jó. Megoldás: szemafor változó (~sorompó) : ha fel van engedve lehet üzenni, ha valaki használja akkor leengedi és addig a többiek nem férnek hozzá – kölcsönös kizárást biztosít, a változó elérése atomi művelet lesz. A szemafornál lehet egynél több szál is védett részben – számláló. Pl: bármilyen író-olvasó rendszerben - egyszerre többen is olvashatnak
.Net előadás jegyzet – 11. óra
interface ISemaphore { void Initialize(int count); void ObtainResource(); void ReleaseResource(); } #region New Semaphore (.NET 2.0) class NewSemaphore : ISemaphore { public void Initialize(int count) { sem = new Semaphore(0, int.MaxValue); } public void ObtainResource() { sem.WaitOne(); } public void ReleaseResource() { sem.Release(1); } private System.Threading.Semaphore sem; } #endregion }
Lock és Monitor: Kritikus szakaszt készíthetünk lock segítségével – egy blokkot lehet lockolni: Object thisLock = new Object(); lock (thisLock) { // Critical code section }
Ez tulajdonképp ezzel ekvivalens: Monitor.Enter(x); try { // Code that needs to be protected by the monitor. } finally { Monitor.Exit(x); }
4.oldal
.Net előadás jegyzet – 11. óra
5.oldal
Collection-ök szinkronizációja (.NET 1.1) 1. SyncRoot mező Icollection-ben van. Vissza kell adnia a szinkronizálásra használhato objektumot. Ezt megadjuk monitornak: // a lista egy ArrayList típusú változó lock (lista.SnycRoot) { Foreach (int i in lista){ ... } }
2. Synchronized metódus A synchronized egy bonyolultabb(de használható) megoldás. Ezt meghívva egy gyűjteményből kapunk egy másikat aminek minden metódusát kritikus szakasz védi a konkurens hozzáféréstől. ArrayList myAL; … ArrayList mySyncdAL = ArrayList.Synchronized( myAL );
Várakozási sor implementációja - példa A WqueueEx program bemutatja a szemaforok használatát az egyik leggyakoribb többszálú modellen – várakozási sor, vagy másként termelő-fogyasztó modell. A szemafort kétféle képpen valósíthatjuk meg. A modernebb .NET 2.0 változat már fent szerepelt. - New Semaphore (.NET 2.0)) A .NET egy féle megoldás kissé bonyolultabb. #region OldSchool Semaphore (.NET 1.1) // --------------------------------------------------/// <summary> /// Semaphore implementációja /// Minden metódusa védett /// // --------------------------------------------------class OldSchoolSemaphore : ISemaphore { private object lockObjSem; // --------------------------------------------------/// <summary> /// Egy új semaphore objektumot hoz létre. /// /// <param name="count">Mennyi a semaphore értéke /// (felhasználható objektumok száma) // --------------------------------------------------public void Initialize(int count)
.Net előadás jegyzet – 11. óra { Count = count; lockObjSem = new object(); } // --------------------------------------------------/// <summary> /// Ha kizárólagosan megkapja a lockObj-t, akkor addig vár, amíg nem kap /// felhasználható erőforrást. /// Konkrétan a Monitor.Wait elengedi a lock objektum lock-ját és addig vár, /// és addig vár, amíg újra vissza nem kapja. /// Ha van erőforrás, elveszi /// // --------------------------------------------------public void ObtainResource() { lock (lockObjSem) { while (Count == 0) { Monitor.Wait(lockObjSem, Timeout.Infinite); } Count--; } } // --------------------------------------------------/// <summary> /// Visszaadja az erőforrást. /// Jelez a Monitor.Wait-nek, hogy visszakapta a lock-ot /// // --------------------------------------------------public void ReleaseResource() { lock (lockObjSem) { Count++; Monitor.Pulse(lockObjSem); } } private int Count; } #endregion
Várakozási sor példa főprogramja: namespace WQueueEx { class Program { static void Producer(object queue) { WaiterQueue
wQueue = (WaiterQueue)queue; Random rnd = new Random(); while (true) { wQueue.Put(rnd.Next(1000)); Thread.Sleep(1); } } static void Consumer(object queue) { WaiterQueue wQueue = (WaiterQueue)queue; while (true)
6.oldal
.Net előadás jegyzet – 11. óra
7.oldal
{ int val = wQueue.Get(); Console.WriteLine(val); Thread.Sleep(1); } } static void Main(string[] args) { //WaiterQueue wQueue = new WaiterQueue(new OldSchoolSemaphore() ); WaiterQueue wQueue = new WaiterQueue(new NewSemaphore()); //start Thread prodThread = new Thread(new ParameterizedThreadStart(Producer)); Thread consThread = new Thread(new ParameterizedThreadStart(Consumer)); prodThread.Start(wQueue); consThread.Start(wQueue); //wait Console.ReadLine(); //end prodThread.Abort(); consThread.Abort(); prodThread.Join(); consThread.Join(); } } }
Thread pool Futásra készen tart néhány szálat, hogy könnyen ell lehessen indítani ha hívás történik. (~ hálózati programoknál - Connection Pool Egy hálózati kapcsolatnál sok beállítás kell. Jó ha készenlétben tartunk nyitott kapcsolatokat, amiket gyorsan ki lehet adni.) Példa program: Mohikan webserver
Timerek Ütemezéshez használhatunk időzítőket – TIMER-eket. Típusai: - Winform-os - Nem Winform-os Grafikus felhasználói felület 3. ....................................................................................................... 1 Képek kezelése ........................................................................................................................ 1 Dupla pufferelés ...................................................................................................................... 2 Szálkezelés ...................................................................................................................................... 3 Thread-ek ................................................................................................................................ 3 Szinkronizáció ......................................................................................................................... 3 Várakozási sor implementációja - példa ................................................................................. 5 Thread pool ............................................................................................................................. 7 A teljes jegyzet tartalomjegyzéke: .................................................................................................. 8
.Net előadás jegyzet – 11. óra
8.oldal
A teljes jegyzet tartalomjegyzéke:
.NET Framework alapjai ............................................................... Error! Bookmark not defined. Fejlődés ................................................................................. Error! Bookmark not defined. A .NET előnyei ..................................................................... Error! Bookmark not defined. Implementációk ..................................................................... Error! Bookmark not defined. Platform Architektúra ............................................................ Error! Bookmark not defined. Futtatókörnyezet (CLR) ........................................................ Error! Bookmark not defined. .NET FrameWork szolgáltatások .......................................... Error! Bookmark not defined. Intermedaite Language - . NET assembly ............................. Error! Bookmark not defined. BCL (Base Class Library)– osztálykönyvtár ........................ Error! Bookmark not defined. Támogatott Nyelvek .............................................................. Error! Bookmark not defined. C-Sharp nyelv alapjai 1. ................................................................ Error! Bookmark not defined. Egyszerű példák .................................................................... Error! Bookmark not defined. Típusok .................................................................................. Error! Bookmark not defined. Alapvető programkonstrukciók ............................................. Error! Bookmark not defined. Osztályok ............................................................................... Error! Bookmark not defined. C-Sharp nyelv alapjai 2. ................................................................ Error! Bookmark not defined. Öröklődés .............................................................................. Error! Bookmark not defined. Interface-ek............................................................................ Error! Bookmark not defined. Property-k .............................................................................. Error! Bookmark not defined. Delegate ................................................................................. Error! Bookmark not defined. Exception handling ................................................................ Error! Bookmark not defined. C-Sharp nyelv alapjai 3. ................................................................ Error! Bookmark not defined. Attribútumok ......................................................................... Error! Bookmark not defined. Genericek .............................................................................. Error! Bookmark not defined. Kő-papír-olló játék ................................................................ Error! Bookmark not defined. Reflection .............................................................................. Error! Bookmark not defined. Mi az az assembly? ............................................................... Error! Bookmark not defined. Strong name - erős név .......................................................... Error! Bookmark not defined. Betöltő (Fusion) - GAC, natív image .................................... Error! Bookmark not defined. .NET alapszolgáltatások 1. ............................................................ Error! Bookmark not defined. Szövegkezelés ....................................................................... Error! Bookmark not defined. Encoding................................................................................ Error! Bookmark not defined. Beépített gyűjtemények ......................................................... Error! Bookmark not defined. Saját gyűjtemények ............................................................... Error! Bookmark not defined. File-ok kezelése ..................................................................... Error! Bookmark not defined.
.Net előadás jegyzet – 11. óra
9.oldal
.NET alapszolgáltatások 2. ............................................................ Error! Bookmark not defined. Directory-k kezelése .............................................................. Error! Bookmark not defined. Dátumkezelés ........................................................................ Error! Bookmark not defined. Stream-ek .............................................................................. Error! Bookmark not defined. Futási környezet .................................................................... Error! Bookmark not defined. Protocol-spec hálózati szolgáltatások .................................... Error! Bookmark not defined. Socket-ek ............................................................................... Error! Bookmark not defined. Együttműködés - Interop (Inter Operation) ........................... Error! Bookmark not defined. .NET és az XML ........................................................................... Error! Bookmark not defined. XML alapok .......................................................................... Error! Bookmark not defined. Alacsony szintű elérése ......................................................... Error! Bookmark not defined. Szerializáció .......................................................................... Error! Bookmark not defined. app.config .............................................................................. Error! Bookmark not defined. Alkalmazásarchitekturák és az Adatbáziselérés alapjai ................ Error! Bookmark not defined. Eddig ..................................................................................... Error! Bookmark not defined. Klasszikus Enterprise Architektúra ....................................... Error! Bookmark not defined. Példa ...................................................................................... Error! Bookmark not defined. Grafikus felhasználói felület 1. ..................................................... Error! Bookmark not defined. Üzenetvezérelt végrehajtás .................................................... Error! Bookmark not defined. Form készítése alapvető control-okkal .................................. Error! Bookmark not defined. Alapvető UI tuning és responsibility példa ListView-val ..... Error! Bookmark not defined. Grafikus felhasználói felület 2. ..................................................... Error! Bookmark not defined. COM alapú control-ok .......................................................... Error! Bookmark not defined. A háromrétegű architektúra UI rétege ................................... Error! Bookmark not defined. Származtatott Form-ok készítése .......................................... Error! Bookmark not defined. User control-ok (Felhasználó által definiált vezérlők) .......... Error! Bookmark not defined. Grafikus felhasználói felület 3. ....................................................................................................... 1 Képek kezelése ........................................................................................................................ 1 Dupla pufferelés ...................................................................................................................... 2 Szálkezelés ...................................................................................................................................... 3 Thread-ek ................................................................................................................................ 3 Szinkronizáció ......................................................................................................................... 3 Várakozási sor implementációja - példa ................................................................................. 5 Thread pool ............................................................................................................................. 7 A teljes jegyzet tartalomjegyzéke: .................................................................................................. 8 A jegyzet készítői: Tóth Katalin Tünde Kovács István ELTE 2008.