Programowanie Współbieżne

Wielkość: px
Rozpocząć pokaz od strony:

Download "Programowanie Współbieżne"

Transkrypt

1 Programowanie Współbieżne C# 1

2 Materiały

3 Pierwsze kroki 3

4 Pierwsze kroki 4

5 Pierwsze kroki 5

6 Pierwsze kroki 6

7 Pierwsze kroki Z zestawu narzędzi wybieramy przycisk 7

8 Pierwsze kroki Ustawiamy przycisk 8

9 Pierwsze kroki We właściwościach zmieniamy nazwę przycisku jego tekst 9

10 Pierwsze kroki Po dwukrotnym kliknięciu otworzy nam się wygenerowany automatycznie kod programu do uzupełnienia 10

11 Pierwsze kroki Następnie uzupełniamy nasz kod jedną linią: MessageBox.Show("Hello world"); Kompilacja i uruchomienie F5 lub ctrl+f5 11

12 Wątki Kiedy przydają nam się wątki? Gdy chcemy by nasz program reagował gdy wykonuje w tle jakieś ciężkie zadanie Różnego rodzaju procesy serwery. Podczas oczekiwania na dane na jednym wątku, program może coś wykonywać na innym. Gdy mamy program, który wykonuje sporo obliczeń (np. kompresja plików multimedialnych) i chcemy je w jakiś sposób zrównoleglić. Efekt będzie odczuwalny gdy fizycznie będziemy dysponować wieloma rdzeniami. Liczbę tę można sprawdzić za pomocą Environment.ProcessorCount 12

13 Wątki Kiedy wątki mogą nam szkodzić? Gdy będzie ich za dużo. Czas przełączania i alokacji zbyt kosztowny, Gdy zadanie wykonywane przez wątek będzie krócej trwało niż powołanie danego wątku. Gdy w pełni nie przewidzimy interakcji pomiędzy wątkami, debugowanie jest bardzo kłopotliwe. Gdy używamy dużo dysku, nie powinniśmy powoływać wiele wątków, a raczej jeden, dwa i szeregować zadania odczytu i zapisu. (ktoś próbował skopiować z płyty CD/DVD kilka plików naraz?) 13

14 Wątki Gdy operujemy na wątkach musimy dodać do programu using System.Threading; Każdy program ma przynajmniej jeden wątek, zwany wątkiem głównym Każdy wątek ma swój oddzielny stos więc zmienne lokalne są modyfikowane niezależnie. Zmienne globalne są współdzielone przez wątki (często wymagana synchronizacja) 14

15 Wątki Przykład uruchomienia metod działających jako wątki. private void naszwatekbezparametrow() MessageBox.Show("wątek ZUPELNIE bez parametrów"); private void naszwatek(object o) MessageBox.Show("jestem sobie " + Thread.CurrentThread.Name + "\nwiadomość to: " + (string)o); private void naszwatek() MessageBox.Show("wątek bez parametrów, przeciążony"); 15

16 Wątki Przykład uruchomienia bez parametrów Thread watek = new Thread(new ThreadStart(naszWatekBezParametrow)); //Thread watek = new Thread(naszWatekBezParametrow); //kompilator sam sobie resztę doda //Thread watek = new Thread(new ThreadStart(naszWatek)); //Thread watek = new Thread(naszWatek); //Gdy mamy przeciążone metody (bez i z parametrami kompilator nie wie czy zastosować ThreadStart czy ParameterizedThreadStart watek.start(); //jako wątek bez parametrów przy próbie Start(wiadomosc) zakończy się błędem podczas uruchomienia //string wiadomosc = "jakaś wiadomość"; //watek.start(wiadomosc); 16

17 Wątki Przykład uruchomienia z parametrami private void naszwatekzparametrem(object wiadomosc) MessageBox.Show((string)wiadomosc); Thread watek = new Thread(new ParameterizedThreadStart(naszWatekZParametrem)); //Thread watek = new Thread(naszWatekZParametrem); //Thread watek = new Thread(new //ParameterizedThreadStart(naszWatek)); //watek.start(); //Możliwy taki start ale nie będzie parametrów watek.start("jakaś wiadomość będąca parametrem"); 17

18 Wątki Przykład uruchomienia anonimowego private void naszwatekzkonkretnymparametrem(string wiadomosc) MessageBox.Show("Nasz wątek z konkretnym parametrem dostał wiadomość: \n" + wiadomosc); string zmiennawiadomosc; zmiennawiadomosc = "Wiadomość przed utworzeniem wątku"; Thread watek = new Thread(delegate() naszwatekzkonkretnymparametrem(zmiennawiadomosc); ); // zastosowanie anonimowej metody, nie musimy podawać parametru object tylko możemy konkretnego typu np. string zmiennawiadomosc = "Wiadomość po utworzeniu wątka"; // Thread watek = new Thread(delegate() MessageBox.Show("wiadomość 1"); MessageBox.Show("Wiadomość 2"); ); watek.start(); 18

19 Wątki Przykład uruchomienia anonimowego z lambdą private void button3b_click(object sender, EventArgs e) Thread watek = new Thread((s) => //kod wątku MessageBox.Show(s as string); ); watek.start("jakaś wiadomość będąca parametrem w wątku anonimowym wystartowanym z zapisem lambda"); 19

20 Wątki Przykład uruchomienia z obiektu public class RozneWatki public void watek1() MessageBox.Show("jestem sobie wątek1"); public void watek2() MessageBox.Show("jestem sobie wątek2"); RozneWatki roznewatki = new RozneWatki(); Thread watek1 = new Thread(rozneWatki.watek1); Thread watek2 = new Thread(rozneWatki.watek2); watek1.start(); watek2.start(); 20

21 Wątki Nazywanie wątków pomoc w debugowaniu Thread watek = new Thread(naszWatek); watek.name = "Ot taka nazwa"; private void naszwatek() MessageBox.Show(Thread.CurrentThread.Name); 21

22 Wątki Wątki pierwszoplanowe i w tle Thread watek = new Thread(naszWatek); watek.isbackground = true; //gdy true zamknięcie głównego zamyka też potomny watek.start(); private void naszwatek() MessageBox.Show(Thread.CurrentThread.Name); Domyślnie IsBackground = false dlatego po zamknięciu głównej aplikacji nadal widzimy wątki z niej powstałe. Gdy ustawimy na true wyjście z wątka głównego powoduje natychmiastowe zakończenie wątków potomnych. Blok finaly jest pomijany. Jest to sytuacja nie pożądana dlatego powinniśmy poczekać na koniec wątków potomnych. Zmiana pracy z tła do pierwszoplanowej i odwrotnie nie wpływa na priorytet. 22

23 Wątki Priorytetowość enum ThreadPriority Lowest, BelowNormal, Normal, AboveNormal, Highest Oznacza jak dużo czasu procesora przyznane jest dla danego wątka w grupie wątków jednego procesu. Ustawienie na Highest wcale nie oznacza, że będzie to wątek czasu rzeczywistego. Trzeba by było również ustawić priorytet dla procesu. Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; Jest jeszcze wyższy priorytet Realtime, wtedy nasz proces będzie działał nieprzerwanie, jednak gdy wejdzie w pętle nieskonczoną nie odzyskamy kontroli nad systemem. W przypadku gdy nasza aplikacja posiada (zwłaszcza skomplikowany) interfejs graficzny, też nie powinniśmy podnosić priorytetu, gdyż odświerzanie spowoduje zpowolnienie całego systemu. 23

24 Wątki Wyjątki Try watek.start(); catch MessageBox.Show("błąd przy uruchamianiu"); Takie uruchomienie zwróci nam jedynie wyjątek przy uruchamianiu, nie przechwycimy wyjątku "rzuconego" w wątku. Wyjątki z wątków mogą zakończyć aplikację, trzeba je przechwytywać na poziomie wątków. 24

25 Synchronizacja Blokowanie Procesy zablokowane z powodu oczekiwania na jakieś zdarzenie, np. Sleep, Join, lock, Semaphore itp. Natychmiastowo zrzekają się czasu procesora, dodają WaitSleepJoin do właściwości ThreadState i nie kolejkują się do czasu odblokowania. Odblokowanie może nastąpić z 4 przyczyn: Warunek odblokowania został spełniony Minął timeout Został przerwany przez Thread.Interrupt Zosatł przerwany przez Thread.Abort 25

26 Synchronizacja Oczekiwanie Sleep i SpinWait static void Main() Thread.Sleep (0); // zrzeknięcie czasowego Thread.Sleep (1000); // uśpij na Thread.Sleep (TimeSpan.FromHours godzinę Thread.Sleep (Timeout.Infinite); do czasu przerwania. się przydzielonego kwantu 1000 ms (1)); // uśpij na 1 // śpij wiecznie :) czyli Ogólnie Sleep powoduje rezygnację wątku z czasu procesora. Wątek taki nie jest kolejkowany przez podany czas. Thread.SpinWait (100); // nic nie rób przez 100 cykli Wątek nie rezygnuje z procesora, jednak wykonuje na nim puste operacje. Nie jest w stanie WaitSleepJoin i nie może być przerwany przez Interrupt. Można zastosować gdy chcemy czekać bardzo krótko. 26 Podobnie zachowuje się wątek podczas aktywnego czekania.

27 Synchronizacja Oczekiwanie Join Thread watek1 = new Thread(new ParameterizedThreadStart(naszWatekZParametrem)); watek1.start("wątek z Join."); watek1.join(); Czekamy na zakończenie watku. Mechanizm, zbierania komunikatów nie jest zatrzymany, więc jak klikniemy jakiś guzik w wątku głównym to ostatecznie doczekamy się reakcji. 27

28 Sekcja krytyczna Kilka wątków (n_wątków) robi to samo zadanie: for (int ii = 0; ii < ; ii++) licznik++; Bez zabezpieczeń wynik będzie wynosił <= n_wątków*

29 Sekcja krytyczna lock private object blokowacz = new object();... for (int ii = 0; ii < ; ii++) lock (blokowacz) licznik++; W danym momencie tylko jeden wątek, może przebywać w chronionym obszarze inne będą czekały w kolejce FIFO Wątki czekające są w stanie WaitSleepJoin. Wątki takie można też zakończyć przez przerwanie lub abort 29

30 Sekcja krytyczna Wybór obiektu który będzie blokował Musi to być typ referencyjny Zwykle jest związany z obiektami na których działamy np.: class Bezpieczna List <string> list = new List <string>(); void Test() lock (list) list.add ("Item 1");... Powinniśmy stosować obiekty które są private by uniknąć niezamierzonej interakcji z zewnątrz Z tego samego powodu nie powinniśmy stosować np. lock (this) lub lock (typeof (Widget))... Użycie obiektu do zablokowania fragmentu kodu nie powoduje automatycznie blokowania danego obiektu. lock(list1) list2.add ("Item 1");... 30

31 Sekcja krytyczna Monitor rozwinięcie lock Lock faktycznie jest skrótem składniowym czegoś takiego: Monitor.Enter(blokowacz); try licznik++; finally Monitor.Exit(blokowacz); Wywołanie Monitor.Exit bez uprzedniego Monitor.Enter spowoduje rzucenie wyjątku Monitor posiada też metodę TryEnter gdzie możemy podać timeout jeżeli wejdziemy przed końcem czasu to zwróci true lub false jeżeli wystąpi timout. 31

32 Sekcja krytyczna Interlocked operacje atomowe for (int ii = 0; ii < ; ii++) Interlocked.Increment(ref licznik); Dodatkowo mamy do dyspozycji Add Dodadawanie do dwóch liczb CompareExchange porównanie i ewentualna podmiana Decrement zmniejszenie Equals czy równe Exchange Zamiana Read odczyt liczby 64b ReferenceEquals porównanie dwóch referencji 32

33 Sekcja krytyczna Blokowanie zagnieżdżone static object x = new object(); static void Main() lock (x) Console.WriteLine ("Zablokowałem"); Nest(); Console.WriteLine ("Odblokowałem"); //Tutaj odblokowane zupełnie static void Nest() lock (x) //Tu podwójny lock //Tu odblokowane tylko ostatnie zagnieżdżenie Wątek blokujący może blokować ile chce, jednak blokowany i tak będzie czekał na tym najbardziej zewnętrznym. 33

34 Sekcja krytyczna Kiedy blokować Wszędzie tam, gdzie wiele wątków może mieć dostęp do wspólnych zmiennych Wszędzie tam, gdzie chcemy mieć niepodzielność operacji, np. sprawdzenie warunku i wykonanie czegoś Na co uważać Nie powinniśmy zbyt dużo blokować bo ciężko analizować taki kod a łatwo spowodować DeadLock Zbyt duże fragmenty kodu wykonywane przez pojedynczy proces powodują zubożenie współbieżności. 34

35 Przerwanie wątku Thread.Interrupt przerywa bieżące czekanie i powoduje rzucenie wyjątku ThreadInterruptedException private void wateknieskonczony() try Thread.Sleep(Timeout.Infinite); catch (ThreadInterruptedException ex) MessageBox.Show("przechwycony wyjątek:"+ex.message); MessageBox.Show("A tu koniec"); Należy pamiętać, że przerywanie w ten sposób może być niebezpieczne, chyba, że wiemy dokładnie w którym miejscu jesteśmy i posprzątamy. 35

36 Przerwanie wątku Thread.Abort Działa podobnie jak Interrupt z tą różnicą, że rzuca wyjątkiem ThreadAbortException oraz wyjątek jest ponownie rzucany pod koniec bloku catch, chyba że w bloku catch zastosujemy Thread.ResetAbort(); Działanie jest podobne, jednak w przypadku Interrupt wątek przerywany jest tylko w momencie czekania, Abort może tego dokonać w dowolnym miejscu wykonywania, nawet w nienaszym kodzie. 36

37 Stany wątku ThreadState kombinacja bitowa trzech warstw. Uruchomienie, blokada, przerwanie wątku (Unstarted, Running, WaitSleepJoin, Stopped, AbortRequested) Pierwszoplanowość i drugoplanowość wątku (Background, Foreground) Postęp w zawieszeniu wątku (SuspendRequested, Suspended ) używane przez przestarzałe metody Ostateczny stan wątku określa się przez sumę bitową tych trzech Warstw. I tak, może być np wątek Background, Unstarted lub SuspendRequested, Background, WaitSleepJoin 37

38 Stany wątku W enumeracji ThreadState są też nigdy nie używane dwa stany: StopRequested i Aborted By jeszcze bardziej skomplikować, Running ma wartość 0 więc porównanie if ((t.threadstate & ThreadState.Running) > 0)... nic nam nie da Można się wspomóc IsAlive jednak zwraca false tylko przed startem i gdy się zakończy. Gdy jest zablokowany też jest true. Najlepiej napisać sobie swoją metodę: public static ThreadState SimpleThreadState (ThreadState ts) return ts & (ThreadState.Aborted ThreadState.AbortRequested ThreadState.Stopped ThreadState.Unstarted Thr eadstate.waitsleepjoin); 38

39 Stany wątku WaitSleepJoin Abort Wątek blokowany Unstarted Start Wątek odblokowany Abort Running Abort Requested ResetAbort Zakończenie wątku Stopped Teoretycznie Zakończenie wątku Aborted 39

40 Wait Handles Win32 Api dostarcza trzech klas EventWaitHandle Mutex Semaphore Wszystkie 3 bazują na abstrakcyjnej klasie WaitHandle EventWaitHandle ma dwie podklasy AutoResetEvent ManualResetEvent Różnią się one tylko sposobem wywołania konstruktora. WaitHandles pozwalają na nazwanie klas i używanie pomiędzy odrębnymi procesami 40

41 Wait Handles AutoResetEvent Można porównać do bramki która przepuszcza tylko jeden proces za naciśnięciem jednego guzika. Gdy bramka jest otwarta proces lub wątek który wywoła metodę WaitOne() przechodzi przez bramkę jednocześnie ją zamykając Gdy bramka jest zamknięta proces ustawia się w kolejce. Każdy inny nie zablokowany proces może odblokować bramkę za pomocą wywołania metody Set() Jedno wywołanie Set() wpuści tylko jeden proces. Gdy nie będzie procesów w kolejce, Set() otworzy bramkę Gdy bramka jest już otwarta, następne Set() są ignorowane. 41

42 Wait Handles AutoResetEvent EventWaitHandle czekaczka = new EventWaitHandle (false, EventResetMode.Auto); EventWaitHandle czekaczka = new AutoResetEvent (false); Powyższe dwa wywołania są równoważne. Pierwszy parametr określa czy bramka ma być podczas utworzenia otwarta. Przykład (WaitHandles) 42

43 Wait Handles EventWaitHandle - międzyprocesowe EventWaitHandle czekaczka = new EventWaitHandle (false, EventResetMode.Auto,"Nasza nazwa czekaczki"); Trzecim parametrem może być nazwa widziana przez wszystkie inne procesy w systemie. Gdy podczas tworzenia okaże sie że obiekt o podanej nazwie istnieje dostaniemy tylko referencję a czwarty parametr będzie false; EventWaitHandle (false, EventResetMode.Auto,"Nasza nazwa czekaczki", out czynowy); Przykład (WaitHandles) 43

44 Ready Go Załóżmy, że mamy taki scenariusz Główny proces ma co chwilę nowe zadania do wykonania Zadania te mają być wykonane przez wątek Za każdym razem uruchamiany jest nowy wątek Przekazywane jest zadanie Po wykonaniu pracy wątek jest kończony By zmniejszyć obciążenie wynikające z tworzenia wątków (czy nawet innych procesów) możemy postępować według poniższego algorytmu: Główny proces tworzy wątek Wątek czeka na zadanie Wykonuje zadanie Przechodzi w stan oczekiwania na kolejne zadanie 44

45 Ready Go Najprostsza wersja producenta i konsumenta static static static static EventWaitHandle ready = new AutoResetEvent(false); EventWaitHandle go = new AutoResetEvent(false); volatile string zadanie; void Main(string[] args) new Thread(Konsument).Start(); for (int i = 1; i <= 5; i++) //przekaż 5 razy zadanie ready.waitone(); // Czekamy na gotowość konsumenta zadanie = "a".padright(i, 'a'); // przygotowujemy zadanie go.set(); // mówimy że dane gotowe do odbioru ready.waitone(); zadanie = null; go.set(); // każemy skończyć Console.ReadKey(); static void Konsument() while (true) ready.set(); // Informujemy producenta że jesteśmy gotowi go.waitone(); // i czekamy na dane if (zadanie == null) return; // gdy dostaniemy null kończymy Console.WriteLine(zadanie); Przykład ReadyGo 45

46 Kolejka producent - konsument Wykorzystanie procesu drugoplanowego Producent kolejkuje elementy Konsument dekolejkuje elementy Rozwiązanie podobne do poprzedniego tylko nie blokujące class ProducentKonsument : Idisposable EventWaitHandle czekaczka = new AutoResetEvent(false); Thread konsumentwatek; Queue<string> kolejka = new Queue<string>(); public ProducentKonsument() konsumentwatek = new Thread(konsument); konsumentwatek.name = "konsumentwatek"; konsumentwatek.start(); 46

47 Kolejka producent - konsument void konsument() while (true) string mesg = null; lock (kolejka) if (kolejka.count > 0) mesg = kolejka.dequeue(); if (mesg == null) return; if (mesg!= null) Console.WriteLine("odebralem: " + mesg); Thread.Sleep(1000); else Console.WriteLine("no to czekam..."); // Jeżeli nie ma więcej zadań to czekaj czekaczka.waitone(); 47

48 Kolejka producent - konsument public void zakolejkuj(string mesg) lock (kolejka) kolejka.enqueue(mesg); czekaczka.set(); public void Dispose() zakolejkuj(null); konsumentwatek.join(); czekaczka.close(); 48

49 Wait Handles ManualResetEvent EventWaitHandle czekaczka = new EventWaitHandle (false, EventResetMode.Manual); EventWaitHandle czekaczka = new ManualResetEvent (false); Powyższe dwa wywołania są równoważne. Pierwszy parametr określa czy bramka ma być podczas utworzenia otwarta. Metoda Set wpuszcza wszystkich czekających lub wołających WaitOne dopóki nie zamknie się przez Reset. 49

50 Wait Handles Mutex Działa tak samo jak lock z tym że może być używany pomiędzy procesami i jest około 100 razy wolniejszy (przy założeniu że nie blokujemy) Tak samo jak lock zapewnia wyłączny dostęp do bloku programu pomiędzy wywołaniem WaitOne a ReleaseMutex i musi być wywołany z tego samego wątka. Zaletą jest automatyczne zwolnienie mutexa nawet gdy aplikacja się zakończy nie wywołując ReleaseMutex 50

51 Wait Handles Mutex static Mutex mutex = new Mutex(false, "tu.kielce.pl mutex"); private void naszwatekzmutex(object o) for (int ii = 0; ii < ; ii++) mutex.waitone(); licznik++; mutex.releasemutex(); Przykład Sekajca_krytyczna1 51

52 Wait Handles Semaphore Semafor jest jak licznik, który nigdy nie może być mniejszy od 0. Operacja WaitOne zmniejsza ten licznik o 1, jeżeli jest 0 to dany wątek czeka, aż inny zwiększy za pomocą Release. W przypadku semafora, podnieść go może każdy inny wątek, nie tylko ten który go opuścił, tak jak to jest w przypadku lock czy Mutex. Semafor jest nieco szybszy od Mutexa. 52

53 Wait Handles Semaphore static Semaphore semafor = new Semaphore(1, 1); private void naszwatekzsemaphore(object o) for (int ii = 0; ii < ; ii++) semafor.waitone(); licznik++; semafor.release(); Przykład Sekajca_krytyczna1 53

54 Wait Handles Wait, wait, wait... WaitHandle.SignalAndWait Jednoczesne wysłanie sygnału i czekanie. Można w ten sposób zrealizować np. spotkania. private static EventWaitHandle wh1 = new EventWaitHandle(false,EventResetMode.AutoReset); private static EventWaitHandle wh2 = new EventWaitHandle(false,EventResetMode.AutoReset); Jeden z wątków wywołuje: WaitHandle.SignalAndWait(wh1, wh2); Drugi z wątków wywołuje: WaitHandle.SignalAndWait(wh2, wh1); 54

55 Wait Handles Wait, wait, wait... WaitHandle.WaitAll(WaitHandle[] waithandles)czekaj na pozwolenie od wszystkich z waithandles WaitHandle.WaitAny(WaitHandle[] waithandles) Czekaj na pozwolenie od którego kolwiek z waithandles 55

56 Bariera Bariera jest stosowana do synchronizacji pracy wątków w pewnych etapach. Przykładowo w algorytmach genetycznych gdzie czekamy, aż wszystkie wątki zakończą pracę w danej iteracji. Poniżej niezsynchronizowane praca kilku wątków. static void printstring(string inputstring) ThreadStart watek = () => for (int i = 0; i < inputstring.length; i++) Console.Write(inputstring.ToArray()[i]); ; Thread[] watki = new Thread[liczbaWatkow]; for (int i = 0; i<liczbawatkow; ++i) watki[i] = new Thread(watek); watki[i].start(); //Tu poczekamy aż zakończą się wszystkie uruchomione w tej metodzie wątki for (int i = 0; i < liczbawatkow; ++i) Przykład: Barrier watki[i].join(); 56

57 Bariera Próba zastosowania Monitora static void printstringwaitpulse(string inputstring) object o = new object(); int licznikwywolan = 0; ThreadStart watek = () => for (int i = 0; i < inputstring.length; i++) lock (o) Console.Write(inputstring.ToArray()[i]); licznikwywolan++; if (licznikwywolan < liczbawatkow) Monitor.Wait(o); else Monitor.PulseAll(o); //Zasygnalizuj wszystkim że działamy dalej licznikwywolan = 0; ; Thread[] watki = new Thread[liczbaWatkow]; for (int i = 0; i < liczbawatkow; ++i) watki[i] = new Thread(watek); watki[i].start(); //Tu poczekamy aż zakończą się wszystkie uruchomione tej metodzie wątki Przykład:w Barrier for (int i = 0; i < liczbawatkow; ++i) watki[i].join(); 57

58 Bariera Zastosowanie Barrier oraz CountdownEvent static System.Threading.Barrier bariera = new System.Threading.Barrier(liczbaWatkow, (b) => Console.WriteLine(" Bariera w fazie: 0", b.currentphasenumber); ); static void printstringbarrier(string inputstring) ThreadStart watek = () => for (int i = 0; i < inputstring.length; i++) Console.Write(inputstring.ToArray()[i]); bariera.signalandwait(); ce.signal();//gdy zadanie jest wykonane zgłaszamy to by obniżyć licznik ; Thread[] watki = new Thread[liczbaWatkow]; for (int i = 0; i < liczbawatkow; ++i) watki[i] = new Thread(watek); watki[i].start(); //Tu poczekamy aż licznik dotrze do 0 (wszystkie wątki wywołają ce.signal()) ce.wait(); Przykład: Barrier 58

59 Kolekcje Dodawanie do listy przez wiele wątków List<Thread> watki = new List<Thread>(); List<int> liczby = new List<int>(10000); for (int i = 0;i<100;i++) var watek = new Thread(() => for (int l = 0; l<100; l++) liczby.add(i*l); ); watki.add(watek); watek.start(); foreach (var watek in watki) watek.join(); Console.WriteLine($"Liczba elementów w liście zwykłej: liczby.count"); Przykład: Kolekcje 59

60 Kolekcje Zastosowanie ConcurrentBag ConcurrentBag<int> bag = new ConcurrentBag<int>(); List<Thread> watki2 = new List<Thread>(); for (int i = 0; i < 100; i++) var watek = new Thread(() => for (int l = 0; l < 100; l++) bag.add(i * l); ); watki2.add(watek); watek.start(); foreach (var watek in watki2) watek.join(); Console.WriteLine($"Liczba elementów w concurrent bag: bag.count"); Przykład: Kolekcje 60

61 Kolekcje Problem z unikalnymi wartościami ConcurrentBag<int> bag2 = new ConcurrentBag<int>(); List<Thread> watki3 = new List<Thread>(); for (int i = 0; i < 100; i++) var watek = new Thread(() => for (int l = 0; l < 100; l++) if (!bag2.any(x => x == l)) //po sprawdzeniu tego warunku może nastąpić niekorzystny przeplot. bag2.add(l); ); watki3.add(watek); watek.start(); foreach (var watek in watki3) watek.join(); Console.WriteLine($"Liczba elementów w concurrent bag niby Przykład: Kolekcje unikalnych: bag2.count"); 61

62 Kolekcje Zastosowanie ConcurrentDictionary var dictionary = new ConcurrentDictionary<int, object>(); //sztuczka by klucz był wartością a wartość może być null List<Thread> watki4 = new List<Thread>(); for (int i = 0; i < 100; i++) var watek = new Thread(() => for (int l = 0; l < 100; l++) dictionary.tryadd(l, null); ); watki4.add(watek); watek.start(); foreach (var watek in watki4) watek.join(); Console.WriteLine($"Liczba elementów w ConcurrentDictionary unikalnych: dictionary.count"); Przykład: Kolekcje 62

63 Kolekcje Zastosowanie BlockingCollection var blockingcollection = new BlockingCollection<int>(); var producent = new Thread(() => for (int l = 0; l < 100; l++) blockingcollection.tryadd(l); Thread.Sleep(10); blockingcollection.completeadding(); ); var konsument = new Thread(() => for (int l = 0; l < 100; l++) blockingcollection.trytake(out var result2); //co się stanie gdy użyjemy funkcji nieblokującej? // var result2 = blockingcollection.take( ); //a co gdy będzie to funkcja blokująca Console.Write($"result2 "); Thread.Sleep(5); ); producent.start(); Przykład: Kolekcje 63 Thread.Sleep(100); konsument.start();

64 Wait Handles ContextBoundObject Automatyczne blokowanie wywołań metod z jednej instancji klasy. using System.Runtime.Remoting.Contexts; [Synchronization] public class JakasKlasa : ContextBoundObject... CLR (Common Language Runtime) zapewnia, że tylko jeden wątek może wywołać kod tej samej instancji obiektu w tym samym czasie. Sztuczka polega na tym, że podczas tworzenia obiektu klasy JakasKlasa tworzony jest obiekt proxy, przez którego przechodzą wywołania metod klasy 64 JakasKlasa.

65 Wait Handles ContextBoundObject Automatyczna synchronizacja nie może być stosowana do pól protect static ani klas wywodzących się od ContextBoundObject np. Windows Form Trzeba też pamiętać, że nadal nie rozwiązuje nam to problemu gdy wywołamy dla kolekcji coś takiego: BezpiecznaKlasa bezpieka = new BezpiecznaKlasa();... if (bezpieka.count > 0) bezpieka.removeat (0); 65

66 Wait Handles ContextBoundObject Jeżeli z bezpiecznego obiektu tworzony jest kolejny obiekt to automatycznie jest on też bezpieczny w tym samym kontekscie, chyba, że postanowimy inaczej za pomocą atrybutów. [Synchronization (SynchronizationAttribute.REQUIRES_NEW)] public class JakasKlasaB : ContextBoundObject... NOT_SUPPORTED - równoważne z nieużywaniem Synchronized SUPPORTED - dołącz do istniejącego kontekstu synchronizacji jeżeli jest stworzony z innego obiektu, w innym przypadku będzie niesynchronizowany REQUIRED - (domyślny) dołącz do istniejącego kontekstu synchronizacji jeżeli jest stworzony z innego obiektu, w innym przypadku stwórz swój nowy kontekst synchronizacji REQUIRES_NEW - Zawsze twórz nowy kontekst synchronizacji 66

67 Delegaty i zdarzenia Obiektowy odpowiednik wskaźnika do funkcji z c/c++ klasa pochodną z klasy System.Delegate Deklaracja wygląda jak deklaracja funkcji: delegate void PrzykladowyDelegat(); //deklaracja delegatu która jest równoważna z deklaracją klasy By wykorzystać delegat musimy stworzyć nowy obiekt tej klasy. delegate ddd = new PrzykladowyDelegat(jakasFunkcja); jakasfunkcja musi być tego samego typu co delegat. Funkcjonalnie zachowuje się jak klasy wewnętrzne w javie z tym że w javie trzeba było tworzyć całą klasę tu tylko metodę. 67

68 Delegaty i zdarzenia //PrzykladDelegate class Program delegate void JakisDelegat(); // metoda zgodna z deklaracją delegatu static void jakasfunkcja() System.Console.WriteLine("Jakas Funkcja!? Przecieże to był delegat!"); static void Main(string[] args) JakisDelegat ddd = new JakisDelegat(jakasFunkcja); // w tym miejscu delegujemy wywołanie metody jakasfunkcja() ddd(); Console.ReadLine(); 68

69 Delegaty i zdarzenia Zdarzenia (events) są formą komunikacji informowania innych, że wystąpiła jakaś sytuacja. Realizowane są przy pomocy delegatów. Przykład eventa wraz argumentami: public delegate void TikTakEventHandler(object sender, TikTakEventArgs e); public event TikTakEventHandler cykevent; public class TikTakEventArgs : EventArgs public int ktorecykniecie; public bool czywiecznie; 69

70 Delegaty i zdarzenia Zasygnalizowanie zdarzenia: TikTakEventArgs tta = new TikTakEventArgs(); tta.czywiecznie = true; for (int ii = 0;ii<ileRazy;ii++) tta.ktorecykniecie = ii; if (cykevent!=null) cykevent(this,tta); Thread.Sleep(1000); Przykład: PrzykladEventa 70

71 WinForms i wątki Cross-Thread W wielowątkowej aplikacji WinForms nie można używać metod ani pól kontrolek, które nie zostały stworzone w danym wątku. Gdy chcemy zapisać coś na formatce z innego wątku private void niebezpieczneliczydlo() for (int liczba = 0; liczba < 20; liczba++) labellicznik.text = liczba.tostring();... Thread wateklicz = new Thread(niebezpieczneLiczydlo); wateklicz.start(); dostaniemy: Przykład: przykladcrossthread Cross-thread operation not valid: Control 'labellicznik' accessed from a thread other than the thread it was created on. Trzeba posłużyć się pewną sztuczką, którą podpowiada MS. 71

72 WinForms i wątki Komponenty WinForms zawierają własność Control.InvokeRequired oznaczającą, że dane przypisanie wartości należy zlecić do wątka będącego twórcą kontrolki. W tym celu należy użyć metody Control.Invoke wskazując delegata z odpowiednią metodą. Przykład: przykladcrossthread 72

73 WinForms i wątki private void liczydlobezpieczne() ZapiszTekst zapdel = new ZapiszTekst(zapiszTekst); for (int liczba = 0; liczba < 20; liczba++) if (this.labellicznik.invokerequired) // jest w innym wątku więc wymaga //wywołuje delegata zapdel przekazując mu tablicę //parametrów w tym przypadku jeden parametr this.invoke(zapdel, new object[] liczba.tostring()); else // Gdy jest w tym samym wątku this.labellicznik.text = liczba.tostring(); Thread.Sleep(1000); Przykład: przykladcrossthread 73

74 WinForms i wątki Bardziej eleganckim rozwiązaniem będzie stworzenie klasy zawierającej bezpieczne metody: static class ThreadSafeCalls private delegate void SetLabelDelegate(Label label, string tekst); public static void SetLabel(Label label, string tekst) //sprawdzanie czy wywołanie jest niebezpieczne //(spoza wątku który utworzył tę kontrolkę) if (label.invokerequired) // jest w innym wątku więc wymaga // wywołuje delegata zapdel przekazując mu tablicę parametrów // w tym przypadku jeden parametr label.invoke(new SetLabelDelegate(SetLabel), new object[] label, tekst ); //przekazanie do wątku będącego właścicielem kontrolki, żądania jej zmiany else // Gdy jest w tym samym wątku label.text = tekst; 74 Przykład: przykladcrossthread s

75 WinForms i wątki Ustawienie tekst etykietki będzie prostrze i czytelniejsze: private void liczydlobezpieczne2() for (int liczba = 0; liczba < 21; liczba++) ThreadSafeCalls.SetLabel(labelLicznik,liczba.ToString()); Thread.Sleep(500); 75 Przykład: przykladcrossthread

76 WinForms i wątki Kolejna metoda to napisanie zmodyfikowanej klasy komponentu: public class LabelThreadSafe : Label public new string Text get return base.text; set if (this.invokerequired) this.invoke(new Action(() => this.text = value; )); else base.text = value; Przykład: przykladcrossthread 76

77 WinForms i wątki Umieszczamy swój komponent na formatce i normalnie używamy. private void liczydlobezpieczne3() for (int liczba = 0; liczba < 21; liczba++) labelthreadsafelicznik.text = liczba.tostring(); Thread.Sleep(500); 77 Przykład: przykladcrossthread

78 WinForms i wątki Kontekst synchronizacji W.Net wątki mogą posiadać kontekst synchronizacji. Są to obiekt klasy SynchronizationContext. Można sprawdzić badając statyczną własność SynchronizationContext.Current Aplikacje desktopowe mają tworzony automatycznie kontekst synchronizacji dla wątków interfejsu użytkownika. WindowsFormsSynchronizationContext (WinForms), DispatcherSynchronizationContext (WPF), AspNetSynchronizationContext (ASP.NET) Możliwe jest przekazanie kontekstu przez referencję do innego wątku. Wątek, który otrzymał kontekst synchronizacji może wywołać metody lub wyrażenia lambda w wątku z którego kontekst pochodzi 78 Przykład: przykladcrossthread

79 WinForms i wątki Kontekst synchronizacji Mechanizm ten, można użyć do zmiany własności kontrolek wątku okna przez inne wątki. Kontekst posiada dwie metody do uruchamiania kodu w wątku właściciela kontekstu Send podobna do Invoke, blokująca Post metoda asynchroniczna podobna do BeginInvoke/EndInvoke Powyższe metody asynchrocniczne nie przekazują wyjątku na zewnątrz, Metoda Send w WPF też nie przekaże wyjątku Stosując metody BeginInvoke możemy też odczytać stan wątku, czy się zakończył czy nie. W przypadku Post nie jest to możliwe. 79 Przykład: przykladcrossthread

80 Background Worker Jest pomocną klasą z System.ComponentModel, która dostarcza nam następującej funkcjonalności Flaga cancel do zasygnalizowania końca, zamiast Abort Standardowy protokół do do raportowania postępu, zakończenia i przerwania pracy Implementacja IComponent pozwalająca na umieszczenie w VS Designerze. Łapanie wyjątków w wątku workera Możliwość zapisywania postępu bezpośrednio na formatkę w innym wątku (nie ma problemu z wywołaniem Cross-thread), nie musimy używać Control.Invoke 80

81 Background Worker Model tego typu wykorzystuje identyczną składnię, jak asynchroniczne delegaty Aby użyć BacgroundWorkera wystarczy poinformować go obsługując zdarzenie DoWork jaka metoda ma być wykonana w tle i wywołać RunWorkerAsync() Wątek główny kontynuuje działanie, a w tle wykonywana jest funkcja zgłoszona do BackgroundWorkera. BW sygnalizuje postęp prac za pomocą zdarzenia ProgressChanged w jego obsłudze można aktualizować np. ProgressBar Gdy BW skończy sygnalizuje to zdarzeniem RunWorkerCompleted 81

82 Background Worker Zróbmy sobie formatkę jak niżej: Pola nazwane będą textboxczas oraz textboxilosc Guziki buttonstart i buttoncancel ProgressBar - progressbarliczydlo Dodajemy backgroundworkera przeciągając go z toolsów i zmieniamy jego nazwę na backgroundworkerliczydlo 82

83 Background Worker Dwukrotnie klikając w BW otworzy nam się kod wykonywany podczas zdarzenia DoWork Uzupełniamy go private void backgroundworkerliczydlo_dowork(object sender, DoWorkEventArgs e) //uzyskaj obiekt wejsciowy Uwaga: 100/parametry.iloscIteracji*(i+1) ParametryDwa parametry = (ParametryDwa)e.Argument; nie zadziała dla większej liczby iteracji niż 100 for (int i = 0; i < parametry.ilosciteracji; i++) Console.WriteLine("właśnie wykonuję iterację " + i); System.Threading.Thread.Sleep(parametry.czasUspienia); backgroundworkerliczydlo.reportprogress((i + 1)*100 /parametry.ilosciteracji); if (backgroundworkerliczydlo.cancellationpending) e.cancel = true; return; string komunikat="w sumie "+(parametry.ilosciteracji*parametry.czasuspienia)+" milisekund"; e.result = komunikat; 83

84 Background Worker Klasa parametry: class ParametryDwa public int czasuspienia,ilosciteracji; public ParametryDwa(int _czasuspienia, int _ilosciteracji) czasuspienia = _czasuspienia; ilosciteracji = _ilosciteracji; 84

85 Background Worker Dwukrotnie klikając w buttonstart otwiera nam się kod wykonany po kliknięciu w guzik (do uzupełnienia): private void buttonstart_click(object sender, EventArgs e) try //uzyskaj dane z formatki int czas = int.parse(textboxczas.text); int ilosc = int.parse(textboxilosc.text); //umieść to w obiekcie do wysyłki ParametryDwa param = new ParametryDwa(czas, ilosc); backgroundworkerliczydlo.runworkerasync(param); catch (Exception ex) MessageBox.Show(ex.Message); Uruchamiamy (F5), wypełniamy, klikamy start Backgroundworker wykonuje swoją pracę a my możemy dalej 85

86 Background Worker Gdy chcemy się dowiedzieć o końcu zadania i przekazać jakieś parametry wystarczy obsłużyć zdarzenie: RunWorkerCompleted. private void backgroundworkerliczydlo_runworkercompleted(object sender, RunWorkerCompletedEventArgs e) if (e.cancelled) MessageBox.Show("przerwano"); else if (e.error!= null) MessageBox.Show("Błąd: " + e.error.tostring()); else MessageBox.Show("Praca została wykonana\n" + e.result); 86 Przykład: BackgroundWorker

87 Background Worker Jeszcze tylko obsługa eventów kliknięcia cancel oraz zmiana statusu progress bar private void backgroundworkerliczydlo_progresschanged(object sender, ProgressChangedEventArgs e) progressbarliczydlo.value = e.progresspercentage; private void buttoncancel_click(object sender, EventArgs e) backgroundworkerliczydlo.cancelasync(); 87 Przykład: BackgroundWorker

88 Wątki w WPF Jeżeli w aplikacji WPF chcemy zmienić stan kontrolki spoza wątku, który ją utworzył także będziemy mieli problem podobnie jak z aplikacją Win Forms: private void niebezpieczneliczydlo() for (int liczba = 0; liczba < 21; liczba++) labellicznik.content = liczba.tostring(); Thread.Sleep(200); private void buttonstart_click(object sender, RoutedEventArgs e) Thread wateklicz = new Thread(niebezpieczneLiczydlo); wateklicz.start(); 88 Przykład: WPFThread

89 Wątki w WPF Druga wersja już poprawna: delegate void ZapiszTekst(string tekst); private void zapisztekst(string tekst) labellicznik.content = tekst; private void liczydlobezpieczne() ZapiszTekst zapdel = new ZapiszTekst(zapiszTekst); for (int liczba = 0; liczba < 21; liczba++) if (!labellicznik.dispatcher.checkaccess()) labellicznik.dispatcher.invoke(zapdel, new object[] liczba.tostring() ); else labellicznik.content = liczba.tostring(); Thread.Sleep(200); Przykład: WPFThread 89

90 Wątki w WPF Komponenty wizualne kontrolowane są przez wątek okna aplikacji. Wszelkie zmiany zgłaszane są jako żądania z innych wątków do wątku kontrolującego za pośrednictwem obiektu Dispatcher, po wcześniejszym sprawdzeniu za pomocą CheckAccess. Metodę Invoke można przeciążyć podając priorytet wywołania label.dispatcher.invoke(new Action(() => label.content = content; ),System.Windows.Threading.DispatcherPriority.ApplicationIdle); Jest też możliwość zgłaszania, żądań asynchronicznie z pomocą BeginInvoke. 90 Przykład: WPFThread

91 Wątki w WPF Trzecia wersja poprawna, osobna klasa statyczna z bezpiecznymi metodami class ThreadSafeCallsWPF public static void setlabelcontent(label label, object content) if (!label.dispatcher.checkaccess()) label.dispatcher.invoke(new Action(() => label.content = content; )); else label.content = content; private void liczydlobezpieczne2() for (int liczba = 0; liczba < 21; liczba++) ThreadSafeCallsWPF.setLabelContent(labelLicznik, liczba.tostring()); Thread.Sleep(200); 91 Przykład: WPFThread

92 Wątki w WPF Do trzeciej wersji dodajemy canvas Przy próbie narysowania elipsy na kontrolce canvas bez synchronizacji dostajemy następujący błąd: Singe Threaded Apartment model wywodzący się z architektury aplikacji wielowątkowych wykorzystujących obiekty COM (technologia tworzenia obiektów rejestrowanych globalnie w systemie operacyjnym dzięki czemu mogą być wykorzystywane przez inne aplikacje. COM jest podstawą Microsoft OLE, COM+, DCOM czy ActiveX. 92 Przykład: WPFThread

93 Wątki w WPF Czwarta wersja (włączamy STA) Thread wateklicz = new Thread(liczydloNiebezpieczne2); wateklicz.setapartmentstate(apartmentstate.sta); wateklicz.start(); Dostaniemy błąd, który już znamy i wiemy jak sobie z nim poradzić. 93 Przykład: WPFThread

94 Wątki w WPF Dodajemy bezpieczną metodę rysującą elipsy na canvasie: private delegate void drawellipsedelegate(canvas canvas, double w, double h, double x, double y, Brush brush); public static void drawellipse(canvas canvas, double w, double h, double x, double y, Brush brush) if (!canvas.dispatcher.checkaccess()) canvas.dispatcher.invoke(new drawellipsedelegate(drawellipse), new object[] canvas, w, h, x, y, brush ); else Ellipse ellipse = new Ellipse(); ellipse.width = w; ellipse.height = h; ellipse.fill = brush; canvas.children.add(ellipse); Canvas.SetLeft(ellipse, x); Canvas.SetTop(ellipse, y); 94 Przykład: WPFThread

95 Wątki w WPF Teraz powinno wszystko działać (wersja piąta). ThreadSafeCallsWPF.drawEllipse(canvas1, w, h, x, y, Brushes.Red); Jednak gdy chcielibyśmy tworzyć różne kolory a nie używać statycznego: SolidColorBrush scb = new SolidColorBrush(losujKolor()); ThreadSafeCallsWPF.drawEllipse(canvas1, w, h, x, y, scb); Pojawia się kolejny problem: The Application is in break mode, z konsoli można odczytać błąd: Nie można użyć obiektu DependencyObject należącego do innego wątku niż nadrzędny obiekt Freezable. Na szczęście rozwiązanie jest proste. Trzeba wykonać metodę Freeze na obiekcie scb przed jego użyciem. scb.freeze(); 95 Przykład: WPFThread

96 Wątki w WPF Szósta wersja użycie kontekstu synchronizacji private void liczydlobezpieczne3(object par) DispatcherSynchronizationContext context = par as DispatcherSynchronizationContext; for (int liczba = 0; liczba < 21; liczba++) context.send((object s) => labellicznik.content = s as string;, liczba.tostring()); Thread.Sleep(200); Thread wateklicz = new Thread(liczydloBezpieczne3); wateklicz.start(synchronizationcontext.current); 96 Przykład: WPFThread

97 Wątki w WPF Uwaga na niebezpieczeństwo blokady. Nie powinno się tak robić (efekt taki jak byśmy wykonali funkcję sekwencyjnie), ale przy dodaniu oczekiwania na wątek Thread wateklicz = new Thread(liczydloBezpieczne3); wateklicz.start(synchronizationcontext.current); Watek.Join(); W momencie wykonywania funkcji obsługi kliknięcia buttonstart_click startujemy wątek potomny, który w pętli stara się zakolejkować zgłoszenie czynności do wykonania przez wątek macierzysty (Control.Invoke lub SynchronizeContext.Send). Zatrzymują one dalsze działania do momentu zakończenia czynności wątku interfejsu. Niestety wątek macierzysty jest zajęty bo czeka na zakończenie się buttonstart_click, gdzie Joinem czeka na zakończenie wątku potomnego. Przykład: WPFThread 97

98 Wątki w WPF Zamiast Send, można użyć do kolejkowania zgłoszeń metody asynchronicznej Post Spowoduje to wykonanie całej pętli jednak obsługą zgłoszeń interfejs użytkownika zajmie się dopiero po zakończeniu wątku potomnego. Efekt będzie taki, że wszystkie żądania mogą wykonać się jednocześnie, czyli zobaczymy ostateczny wynik licznika. Nie jest to poprawne działanie ale przynajmniej nie mamy już blokady. Przykład: WPFThread 98

99 Apartment Threading Jest logicznym kontenerem zawierającym: Jeden wątek (Single-Threded Apartment) Wiele wątków (Multi-Threded Apartment) Apartment może zawierać zarówno wątki jak i obiekty Kontekst Synchronizacji mógł tylko obiekty Obiekty takie są przypisane do Apartment'u przez cały okres trwania. Obiekty w kontekście synchronizacji mogą być wołane przez dowolne wątki (ale w trybie exclusive) Obiekty w Apartment mogą być wywołane tylko przez wątki w tym samym Apartmencie. 99

100 Apartment Threading Jeżeli można by było przedstawić obrazowo kontener jako bibliotekę, obiekty jako książki a wątki jako osoby to: W przypadku kontekstu synchronizacji do biblioteki wchodziłby sobie ktokolwiek ale zawsze pojedynczo (nie może być dwóch osób w bibliotece) W przypadku apartmentów mamy pracowników przypisanych do biblioteki. Single. Jest jeden bibliotekarz i do niego odwołujemy się by coś przeczytał i nam powiedział co w danej książce jest Multi. Jest wielu bibliotekarzy. 100

101 Apartment Threading Sygnalizowanie bibliotekarzowi, że chcemy skorzystać z jakiejś książki (obiektu) nosi nazwę marshalling. Metoda jest przekazywana (marshal) poprzez pracownika biblioteki i wykonywana na obiektach w bibliotece Marshalling jest zaimplementowany w bibliotekarzu przez system komunikatów w Windows Forms i jest przekazywane automatycznie Jest to mechanizm, który cały czas sprawdza zdarzenia związane z myszką i klawiaturą. Gdy nie zdążą być obsłużone są kolejkowane (FIFO). 101

102 Apartment Threading Wątki.Net są automatycznie przypisane do multithread-appartment chyba, że chcemy by było inaczej wtedy: Thread t = new Thread (...); t.setapartmentstate (ApartmentState.STA); Lub class Program [STAThread] static void Main()

103 Apartment Threading Gdy nasza aplikacja to czysty kod.net Apartment nie ma znaczenia. Typy z System.Windows.Forms korzystają z kodu Win32 przeznaczonego do pracy w Single Thread Apartment. Z tego powodu w programach tego typu wymagane jest [STAThread]. 103

Programowanie Współbieżne

Programowanie Współbieżne Programowanie Współbieżne C# 1 Materiały http://www.microsoft.com/express/download/ http://msdn.microsoft.com/en-us/library/aa645740(vs.71).aspx http://www.albahari.com/threading/ http://www.centrumxp.pl/

Bardziej szczegółowo

using System;... using System.Threading;

using System;... using System.Threading; Kontekst synchronizacji Wątek w platformie.net może posiadać kontekst synchronizacji reprezentowany przez instancję klasy SynchronizationContext lub jej klasy potomnej. Jeżeli wątek posiada taki kontekst

Bardziej szczegółowo

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1 Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie

Bardziej szczegółowo

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ Procesy i wątki Proces posiada samodzielne środowisko wykonawcze. Proces posiada własny zestaw podstawowych zasobów w czasie wykonywania; W szczególności, każdy proces ma własną przestrzeń pamięci. W uproszczeniu

Bardziej szczegółowo

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1 Wątki 1. Wątki - wprowadzenie Wątkiem nazywamy sekwencyjny przepływ sterowania w procesie, który wykonuje dany program np. odczytywanie i zapisywanie plików Program Javy jest wykonywany w obrębie jednego

Bardziej szczegółowo

Współbieżność w środowisku Java

Współbieżność w środowisku Java Współbieżność w środowisku Java Wątki i ich synchronizacja Zagadnienia Tworzenie wątków Stany wątków i ich zmiana Demony Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych

Bardziej szczegółowo

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego Wątki Wątek - definicja Ciąg instrukcji (podprogram) który może być wykonywane współbieżnie (równolegle) z innymi programami, Wątki działają w ramach tego samego procesu Współdzielą dane (mogą operować

Bardziej szczegółowo

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1 Programowanie równoległe i rozproszone Monitory i zmienne warunku Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności Problem producentów i konsumentów: jedna grupa procesów

Bardziej szczegółowo

Aplikacje w Javie- wykład 11 Wątki-podstawy

Aplikacje w Javie- wykład 11 Wątki-podstawy 1 Aplikacje w Javie- wykład 11 Wątki-podstawy Treści prezentowane w wykładzie zostały oparte o: Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 http://docs.oracle.com/javase/8/docs/ http://docs.oracle.com/javase/9/docs/

Bardziej szczegółowo

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4 Spis treści 1 Wątki 1 2 Tworzenie wątków 1 3 Synchronizacja 3 4 Dodatki 3 5 Algorytmy sortowania 4 6 Klasa Runnable 4 Temat: Wątki Czym są wątki. Grafika. Proste animacje. Małe podsumowanie materiału.

Bardziej szczegółowo

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Programowanie w Sieci Internet Python: Wątki Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Wątki akt pierwszy, kilka przydatnych funkcji Lib/threading.py modół pozwalający

Bardziej szczegółowo

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku. Laboratorium 7 Wstęp Jednym z podstawowych własności Javy jest wielowątkowość. Wiąże się to z możliwością współbieżnego wykonywania różnych operacji w ramach pojedynczej wirtualnej maszyny Javy (JVM).

Bardziej szczegółowo

Programowanie wielowątkowe. Jarosław Kuchta

Programowanie wielowątkowe. Jarosław Kuchta Programowanie wielowątkowe Jarosław Kuchta Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Każdy proces ma przynajmniej jeden wątek, chociaż może mieć wiele wątków. Start programu,

Bardziej szczegółowo

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run(). Wątki Streszczenie Celem wykładu jest wprowadzenie do obsługi wątków w Javie. Czas wykładu 45 minut. Definiowanie wątków jako klas potomnych Thread Nadpisanie metody run(). class Watek extends Thread public

Bardziej szczegółowo

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,

Bardziej szczegółowo

Język Java wątki (streszczenie)

Język Java wątki (streszczenie) Programowanie współbieżna Język Java wątki (streszczenie) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Języka Java wątki Autor:

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,

Bardziej szczegółowo

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem. WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM NetBeans Wykonał: Jacek Ventzke informatyka sem. VI 1. Uruchamiamy program NetBeans (tu wersja 6.8 ) 2. Tworzymy

Bardziej szczegółowo

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu. Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody

Bardziej szczegółowo

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1. Wielowątkowość Programowanie w środowisku rozproszonym. Wykład 1. Informacje organizacyjne Wymiar godzin: W-30, LAB-15 Zaliczenie wykonanie kilku programów i ich zaliczenie (w trakcie zajęć laboratoryjnych)

Bardziej szczegółowo

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016 Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,

Bardziej szczegółowo

Złap współbieżnie latające muchy

Złap współbieżnie latające muchy Złap współbieżnie latające muchy Wstęp Artykuł przeznaczony jest dla osób znających podstawy programowania w C#, a chcących dodatkowo zapoznać się z tajnikami tworzenia programów wielowątkowych. W niniejszym

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków mgr inż. Maciej Lasota Version 1.0, 13-05-2017 Spis treści Wyjątki....................................................................................

Bardziej szczegółowo

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Uruchomienie programu powoduje stworzenie nowego procesu przez system operacyjny. Proces wykonywany program wraz

Bardziej szczegółowo

Systemy operacyjne. Zajęcia 11. Monitory

Systemy operacyjne. Zajęcia 11. Monitory Systemy operacyjne. Zajęcia 11. Monitory 1. Monitor to mechanizm zamykający całą pamięć wspólną i synchronizację w pojedynczym module. 2. Monitor posiada całą pamięć wspólną jako część 'prywatną': dostępu

Bardziej szczegółowo

msgbox("akcja: Początek, argument: " + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox("akcja: Koniec"); return DateTime.Now.

msgbox(akcja: Początek, argument:  + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox(akcja: Koniec); return DateTime.Now. Programowanie asynchroniczne. Operator await i modyfikator async Język C# 5.0 wyposażony został w nowy operator await, ułatwiający synchronizację dodatkowych zadań uruchomionych przez użytkownika. Poniżej

Bardziej szczegółowo

Programowanie komputerów

Programowanie komputerów Programowanie komputerów Wykład 7: Programowanie wielowątkowe w Javie dr inż. Walery Susłow Współbieżność Programy współbieżne (concurrent software) aplikacje potrafiące wykonywać kilka operacji w tym

Bardziej szczegółowo

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację. J. Ułasiewicz Programowanie aplikacji współbieżnych 1 11 11.1 abstrakcyjne Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post

Bardziej szczegółowo

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

Programowanie równoległe i asynchroniczne w C# 5.0 / Mateusz Warczak [et al.]. Gliwice, cop Spis treści

Programowanie równoległe i asynchroniczne w C# 5.0 / Mateusz Warczak [et al.]. Gliwice, cop Spis treści Programowanie równoległe i asynchroniczne w C# 5.0 / Mateusz Warczak [et al.]. Gliwice, cop. 2014 Spis treści Wstęp 9 Przedmowa 11 Rozdział 1. Dla niecierpliwych: asynchroniczność i pętla równoległa 13

Bardziej szczegółowo

Instrukcja laboratoryjna cz.3

Instrukcja laboratoryjna cz.3 Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:

Bardziej szczegółowo

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003 Obliczenia równoległe i rozproszone w JAVIE Michał Kozłowski 30 listopada 2003 Wątki w JAVIE Reprezentacja wątków jako obiektów Uruchamianie i zatrzymywanie wątków Realizacja wątków Ograniczenia Mechanizmy

Bardziej szczegółowo

Instrukcja laboratoryjna nr.4

Instrukcja laboratoryjna nr.4 Języki programowania na platformie.net cz.2 2016/17 Instrukcja laboratoryjna nr.4 Język Visual Basic for.net Prowadzący: Tomasz Goluch Wersja: 3.1 I. Współpraca Visual Basic z C# Cel: Wykorzystanie w kodzie

Bardziej szczegółowo

Kurs programowania. Wykład 8. Wojciech Macyna

Kurs programowania. Wykład 8. Wojciech Macyna Wykład 8 Program bez watków, jeden procesor, trzy zadania Program z watkami, jeden procesor, trzy zadania Procesory wielordzeniowe, każde zadanie na osobnym procesorze Trzy zadania uruchomione w watkach

Bardziej szczegółowo

Leszek Stasiak Zastosowanie technologii LINQ w

Leszek Stasiak Zastosowanie technologii LINQ w Leszek Stasiak Zastosowanie technologii LINQ w C# 1. Wstęp - połączenie Do naszych zadań będziemy używać Microsoft Visual Studio 2010. Stwórzmy nowy projekt Windows Form Application. Mając do dyspozycji

Bardziej szczegółowo

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz Zagadnienia 1. Delegaty wiązane, właściwości indeksowane 2. Delegaty niewiązane 3. Nowa wersja kalkulatora, delegaty

Bardziej szczegółowo

Wątki w Javie. Piotr Tokarski

Wątki w Javie. Piotr Tokarski Wątki w Javie Piotr Tokarski Wprowadzenie Co to są wątki? Co to są wątki? Każdy program ma przynajmniej jeden wątek Co to są wątki? Każdy program ma przynajmniej jeden wątek Wątki są po to, by symulować

Bardziej szczegółowo

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji

Bardziej szczegółowo

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h] 1. Typy. Java jest językiem programowania z silnym systemem kontroli typów. To oznacza, że każda zmienna, atrybut czy parametr ma zadeklarowany typ. Kompilator wylicza typy wszystkich wyrażeń w programie

Bardziej szczegółowo

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop. 2016 Spis treści Spis rysunków 11 Spis tabel 13 Przedmowa 15 Wprowadzenie 17 Podziękowania 27 O autorach 29 1 Wprowadzenie

Bardziej szczegółowo

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017 Wykład 8 10 maj 2017 Współbieżność Watki w JAVA-ie Współbieżność może być realizowana na poziomie systemu operacyjnego (procesy) lub na poziomie aplikacji (watki). W JAVA-ie powszechnie stosuje się watki.

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1 Programowanie równoległe i rozproszone W1. Wielowątkowość Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np.

Bardziej szczegółowo

Wykład 5 Okna MDI i SDI, dziedziczenie

Wykład 5 Okna MDI i SDI, dziedziczenie Wykład 5 Okna MDI i SDI, dziedziczenie Autor: Zofia Kruczkiewicz Zagadnienia 1. Aplikacja wielookienkowa. Zakładanie projektu typu CLR Windows Forms 1.1. Aplikacja typu MDI 1.2. Aplikacja typu SDI 2. Dziedziczenie

Bardziej szczegółowo

Java. Programowanie Obiektowe Mateusz Cicheński

Java. Programowanie Obiektowe Mateusz Cicheński Java Programowanie Obiektowe Mateusz Cicheński Wielowątkowość Proces a wątek? Thread vs Runnable sleep(), interrupt(), join() Problemy wielowątkowości Obiekty niemodyfikowalne (immutable) Serializacja

Bardziej szczegółowo

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1 Języki i Techniki Programowania II Wykład 7 Współbieżność 1 Programy, Procesy, Wątki Program to zestaw instrukcji do wykonania, dane do przetworzenia, mechanizmy sterujące (stos) Proces w komputerze to

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe III. Refleksja Małgorzata Prolejko OBI JA16Z03 Plan Klasa Class. Analiza funkcjonalności klasy. Podstawy obsługi wyjątków. Zastosowanie refleksji do analizy obiektów. Wywoływanie

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Wykład 10 - boost Thread. 8 czerwca 2007 Równoległość bardzo wolna reakcja człowieka wolne urządzenia wejścia - wyjścia (np. drukarki) bardzo szybkie procesory można przeprowadzać obliczenia podczas obsługi

Bardziej szczegółowo

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych Jacek Matulewski Materiały dla Podyplomowego Studium Programowania i Zastosowania Komputerów, sekcja Projektowanie i tworzenie aplikacji

Bardziej szczegółowo

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wyjątki Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wydaje się, że żaden użytkownik oprogramowania nie lubi, kiedy stosowany program nagle zawiesza się,

Bardziej szczegółowo

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego 150875 Grzegorz Graczyk numer indeksu imię i nazwisko 151021 Paweł Tarasiuk numer indeksu imię i nazwisko Data 2011-11-07 Kierunek Informatyka Specjalizacja Inżynieria Oprgoramowania i Analiza Danych Rok

Bardziej szczegółowo

Dawid Gierszewski Adam Hanasko

Dawid Gierszewski Adam Hanasko Dawid Gierszewski Adam Hanasko Chcemy stworzyć klasę w której możemy przechowywać dwie zmienne dowolnych typów Tworzymy tyle różnych klas ile potrzeba: Class ParaInt{ int pierwszy; Int drugi; Class ParaButow{

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;

Bardziej szczegółowo

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy - Narzędzie Windows Forms - Przykładowe aplikacje 1 Narzędzia Windows Form Windows Form jest narzędziem do tworzenia aplikacji dla

Bardziej szczegółowo

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku Przykładowa dostępna aplikacja w Visual Studio - krok po kroku Zadaniem poniższego opisu jest pokazanie, jak stworzyć aplikację z dostępnym interfejsem. Sama aplikacja nie ma konkretnego zastosowania i

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 07 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami tworzenia aplikacji okienkowych w C#. Wprowadzenie teoretyczne. Rozważana w

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

Programowanie Obiektowe Ćwiczenie 4

Programowanie Obiektowe Ćwiczenie 4 Programowanie Obiektowe Ćwiczenie 4 1. Zakres ćwiczenia wyjątki kompozycja 2. Zagadnienia Założeniem, od którego nie należy odbiegać, jest by każdy napotkany problem (np. zatrzymanie wykonywanej metody)

Bardziej szczegółowo

PHP 5 język obiektowy

PHP 5 język obiektowy PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje

Bardziej szczegółowo

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java   1 / 13 Klasy Klasa to grupa obiektów, które mają wspólne właściwości, a obiekt jest instancją klasy. Klasa w języku Java może zawierać: pola - reprezentują stan obiektu (odniesienie do pola z kropką), methods

Bardziej szczegółowo

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego

Bardziej szczegółowo

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki Język C# pętle, sterowanie, wyjątki Język C# pętle Pętle: while ( ) do { while ( ); for ( ; ; ) foreach ( in

Bardziej szczegółowo

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację. J. Ułasiewicz Programowanie aplikacji współbieżnych 1 11 Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Bardziej szczegółowo

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Ćwiczenie 1. Kolejki IBM Message Queue (MQ) Ćwiczenie 1. Kolejki IBM Message Queue (MQ) 1. Przygotowanie Przed rozpoczęciem pracy, należy uruchomić "Kreator przygotowania WebSphere MQ" oraz przejść przez wszystkie kroki kreatora, na końcu zaznaczając

Bardziej szczegółowo

Katalog książek cz. 2

Katalog książek cz. 2 Katalog książek cz. 2 Odczytywanie danych z XML Do ćwiczenia dołączony jest plik books.xml zawierający pełen katalog książek. Poniższy listing zawiera przykładowy fragment danych w stosowanym formacie.

Bardziej szczegółowo

Podstawy Programowania 2

Podstawy Programowania 2 Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu

Bardziej szczegółowo

Laboratorium 10 - Web Services

Laboratorium 10 - Web Services Laboratorium 10 - Web Services W ramach laboratorium zapoznamy się z koncepcją Web Service ów (odmiana point-to-point Web Service). W kolejnych krokach utworzony zostanie projekt, w którym wykorzystana

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe i zdarzeniowe Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/23 Programowanie obiektowe i zdarzeniowe wykład 6 polimorfizm Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie

Bardziej szczegółowo

Programowanie zaawansowane

Programowanie zaawansowane Programowanie zaawansowane Ćwiczenie 6 Komunikacja silnie typowana I. Utwórz aplikację okienkową realizującą proste obliczenia arytmetyczne. Obsługa zdarzeń w aplikacji typu Windows Form Application odbywa

Bardziej szczegółowo

Informatyka II. Laboratorium Aplikacja okienkowa

Informatyka II. Laboratorium Aplikacja okienkowa Informatyka II Laboratorium Aplikacja okienkowa Założenia Program będzie obliczał obwód oraz pole trójkąta na podstawie podanych zmiennych. Użytkownik będzie poproszony o podanie długości boków trójkąta.

Bardziej szczegółowo

Podstawy współbieżności

Podstawy współbieżności Podstawy współbieżności Algorytmy i struktury danych. Wykład 6. Rok akademicki: 2010/2011 Od koncepcji współbieżności do systemów rozproszonych Współbieżnośd rozważany na poziomie koncepcyjnym sposób realizacji

Bardziej szczegółowo

Programowanie wielowątkowe. Tomasz Borzyszkowski

Programowanie wielowątkowe. Tomasz Borzyszkowski Programowanie wielowątkowe Tomasz Borzyszkowski Wątki a procesy Jako jeden z niewielu języków programowania Java udostępnia użytkownikowi mechanizmy wspierające programowanie wielowątkowe. Program wielowątkowy

Bardziej szczegółowo

PHP: bloki kodu, tablice, obiekty i formularze

PHP: bloki kodu, tablice, obiekty i formularze 1 PHP: bloki kodu, tablice, obiekty i formularze SYSTEMY SIECIOWE Michał Simiński 2 Bloki kodu Blok if-else Switch Pętle Funkcje Blok if-else 3 W PHP blok if i blok if-else wyglądają tak samo i funkcjonują

Bardziej szczegółowo

Język Java wątki (streszczenie)

Język Java wątki (streszczenie) Programowanie współbieŝna Język Java wątki (streszczenie) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Podstawowe pojęcia: procesy

Bardziej szczegółowo

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie

Bardziej szczegółowo

Klasy i obiekty cz II

Klasy i obiekty cz II Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Klasy i obiekty cz II Hermetyzacja, mutatory, akcesory, ArrayList Rozwijamy aplikację Chcemy, aby obiekty klasy

Bardziej szczegółowo

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C #import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:

Bardziej szczegółowo

Dokumentacja do API Javy.

Dokumentacja do API Javy. Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost; Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Układy VLSI Bramki 1.0

Układy VLSI Bramki 1.0 Spis treści: 1. Wstęp... 2 2. Opis edytora schematów... 2 2.1 Dodawanie bramek do schematu:... 3 2.2 Łączenie bramek... 3 2.3 Usuwanie bramek... 3 2.4 Usuwanie pojedynczych połączeń... 4 2.5 Dodawanie

Bardziej szczegółowo

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU Konstrukcja obiektów Niszczenie obiektów i zwalnianie zasobów

Bardziej szczegółowo

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1 1 LINQ 1 1. Cel zajęć Celem zajęć jest zapoznanie się z technologią LINQ oraz tworzeniem trójwarstwowej aplikacji internetowej. 2. Zadanie Proszę przygotować aplikację WWW, która: będzie pozwalała na generowanie

Bardziej szczegółowo

Laboratorium 1 - Programowanie proceduralne i obiektowe

Laboratorium 1 - Programowanie proceduralne i obiektowe Laboratorium 1 - Programowanie proceduralne i obiektowe mgr inż. Kajetan Kurus 4 marca 2014 1 Podstawy teoretyczne 1. Programowanie proceduralne (powtórzenie z poprzedniego semestru) (a) Czym się charakteryzuje?

Bardziej szczegółowo

xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname="mainregion" />

xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname=mainregion /> 1 Tworzenie Shella a. W pierwszej kolejności tworzymy nowy projekt: WPF Application. Name: Shell SolutionName: PrismApp b. Dodajemy bibliotekę PRISM za pomocą NuGet Managera (dla.net Framework 4.5 Prism

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Wykład 8: Obsługa Wyjątków

Wykład 8: Obsługa Wyjątków Wykład 8: Obsługa Wyjątków Wyjątki Wyjątek to sytuacja nienormalna, która pojawia się w trakcie wykonania programu. W językach bez obsługi wyjątków, błędy są wykrywane i obsługiwane ręcznie, zwykle przez

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016 Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa

Bardziej szczegółowo

Programowanie w środowiskach graficznych. Wykład 3 Język C#

Programowanie w środowiskach graficznych. Wykład 3 Język C# Programowanie w środowiskach graficznych Wykład 3 Język C# 1 Zagadnienia 1. Wprowadzenie 2. Przestrzenie nazw 3. Typy, parametry, konwersje 4. Klasy 5. Instrukcje sterujące 6. Właściwości 7. Interfejsy,

Bardziej szczegółowo

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane

Bardziej szczegółowo

Mechanizmy pracy równoległej. Jarosław Kuchta

Mechanizmy pracy równoległej. Jarosław Kuchta Mechanizmy pracy równoległej Jarosław Kuchta Zagadnienia Algorytmy wzajemnego wykluczania algorytm Dekkera Mechanizmy niskopoziomowe przerwania mechanizmy ochrony pamięci instrukcje specjalne Mechanizmy

Bardziej szczegółowo

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak Plan wykładu Abstrakcja programowania współbieżnego Instrukcje atomowe i ich przeplot Istota synchronizacji Kryteria poprawności programów współbieżnych

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje

Bardziej szczegółowo

Podstawy i języki programowania

Podstawy i języki programowania Podstawy i języki programowania Laboratorium 8 - wprowadzenie do obsługi plików tekstowych i wyjątków mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 11 grudnia 2017 1 / 34 mgr inż. Krzysztof

Bardziej szczegółowo

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static), Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których

Bardziej szczegółowo

Programowanie w Javie

Programowanie w Javie Programowanie w Javie Andrzej Czajkowski Lista nr 0 Debugger w Javie Celem ćwiczenia jest poznanie podstawowych funkcji narzędzia debugera (odpluskwiacz) w środowisku Eclipse. Po ukończeniu ćwiczenia student

Bardziej szczegółowo

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019 Wykład 3 22 marca 2019 Klasy wewnętrzne Klasa wewnętrzna class A {... class B {... }... } Klasa B jest klasa wewnętrzna w klasie A. Klasa A jest klasa otaczajac a klasy B. Klasy wewnętrzne Właściwości

Bardziej szczegółowo