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
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();
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
4.oldal 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);
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 /// </summary> class OldSchoolSemaphore : ISemaphore private object lockobjsem; /// <summary> /// Egy új semaphore objektumot hoz létre. /// </summary> /// <param name="count">mennyi a semaphore értéke /// (felhasználható objektumok száma)</param> public void Initialize(int count)
6.oldal 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 /// </summary> 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 /// </summary> 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<int> wqueue = (WaiterQueue<int>)queue; Random rnd = new Random(); while (true) wqueue.put(rnd.next(1000)); Thread.Sleep(1); static void Consumer(object queue) WaiterQueue<int> wqueue = (WaiterQueue<int>)queue; while (true)
7.oldal int val = wqueue.get(); Console.WriteLine(val); Thread.Sleep(1); static void Main(string[] args) //WaiterQueue<int> wqueue = new WaiterQueue<int>(new OldSchoolSemaphore() ); WaiterQueue<int> wqueue = new WaiterQueue<int>(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
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.
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.