Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie wielowątkowe Jarosław Kuchta. Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Windows jest systemem wielowątkowym.

Podobne prezentacje


Prezentacja na temat: "Programowanie wielowątkowe Jarosław Kuchta. Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Windows jest systemem wielowątkowym."— Zapis prezentacji:

1 Programowanie wielowątkowe Jarosław Kuchta

2 Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Windows jest systemem wielowątkowym. Każdy proces ma przynajmniej jeden wątek, chociaż może mieć wiele wątków. Każdy proces ma przynajmniej jeden wątek, chociaż może mieć wiele wątków. Start programu, to start głównego wątku procesu. Start programu, to start głównego wątku procesu. Główny wątek może uruchomić inny, poboczny wątek. Główny wątek może uruchomić inny, poboczny wątek. Zamknięcie programu, to zamknięcie wszystkich wątków procesu. Zamknięcie programu, to zamknięcie wszystkich wątków procesu.

3 Programowanie wielowątkowe w języku C Start programu: Start programu: main(), wmain() – w programie konsoli main(), wmain() – w programie konsoli WinMain(), wWinMain() – w programie okienkowym WinMain(), wWinMain() – w programie okienkowym Procedura osobnego wątku: Procedura osobnego wątku: void ThreadProc(void *param) { … _endthread(); // zakończenie wątku _endthread(); // zakończenie wątku}

4 Funkcje sterujące wątkami zadeklarowane w process.h: _beginthread – rozpoczęcie wątku _beginthread – rozpoczęcie wątku _beginthreadex – rozszerzone rozpoczęcie wątku _beginthreadex – rozszerzone rozpoczęcie wątku _endthread – zakończenie wątku _endthread – zakończenie wątku _endthreadex – rozszerzone zakończenie wątku _endthreadex – rozszerzone zakończenie wątku

5 Przykład – funkcja wątku void ThreadProc(void *param) { // ten wątek po prostu wypisuje parametr // ten wątek po prostu wypisuje parametr int h=*((int*)param); int h=*((int*)param); printf("%d Thread is Running!\n",h); printf("%d Thread is Running!\n",h); _endthread(); _endthread();}

6 Przykład – funkcja główna int main() { int n; int n; int i; int i; int val = 0; int val = 0; HANDLE handle; HANDLE handle; printf("\t Thread Demo\n"); printf("\t Thread Demo\n"); printf("Enter the number of threads : "); printf("Enter the number of threads : "); scanf("%d",&n); scanf("%d",&n); for(i=1;i<=n;i++) for(i=1;i<=n;i++) { val = i; val = i; handle = (HANDLE) _beginthread( ThreadProc,0,&val); // utworzenie wątku handle = (HANDLE) _beginthread( ThreadProc,0,&val); // utworzenie wątku WaitForSingleObject(handle,INFINITE); // oczekiwanie na zakończenie wątku WaitForSingleObject(handle,INFINITE); // oczekiwanie na zakończenie wątku } return 0; return 0;}

7 Programowanie wielowątkowe w MFC Hierarchia klas MFC: Hierarchia klas MFC: CObject – obiekt abstrakcyjny CObject – obiekt abstrakcyjny CCmdTarget – obiekt aktywny CCmdTarget – obiekt aktywny CWinThread – wątek Windows CWinThread – wątek Windows CWinApp – aplikacja Windows CWinApp – aplikacja Windows Aplikacja Windows jest wątkiem! Aplikacja Windows jest wątkiem! Dwa rodzaje wątków: Dwa rodzaje wątków: User Interface – wątek oparty o okna User Interface – wątek oparty o okna Worker – wątek pracujący w tle Worker – wątek pracujący w tle

8 Użyteczne dane m_nThreadID – identyfikator bieżącego wątku m_nThreadID – identyfikator bieżącego wątku m_hThread – uchwyt bieżącego wątku m_hThread – uchwyt bieżącego wątku m_bAutoDelete – czy wątek ma się sam usunąć po zamknięciu? m_bAutoDelete – czy wątek ma się sam usunąć po zamknięciu?

9 Funkcje wątkowe Funkcje globalne: Funkcje globalne: AfxBeginThread – utworzenie wątku AfxBeginThread – utworzenie wątku AfxEndThread – zamknięcie wątku AfxEndThread – zamknięcie wątku Metody obiektowe: Metody obiektowe: CreateThread – utworzenie i wystartowanie wątku CreateThread – utworzenie i wystartowanie wątku SuspendThread – zawieszenie wątku (inkrementacja licznika zawieszeń) SuspendThread – zawieszenie wątku (inkrementacja licznika zawieszeń) ResumeThread – wznowienie wątku (dekrementacja licznika zawieszeń) ResumeThread – wznowienie wątku (dekrementacja licznika zawieszeń) SetThreadPriority – ustawienie priorytetu wątku SetThreadPriority – ustawienie priorytetu wątku GetThreadPriority – pobranie priorytetu wątku GetThreadPriority – pobranie priorytetu wątku

10 Priorytety wątków THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_IDLE THREAD_PRIORITY_IDLE

11 Przykład z użyciem funkcji Afx CwinThread *pThread = AfxBeginThread( ThreadFunction, &data); UINT ThreadFunction(LPVOID param) { DWORD result =0 ; DWORD result =0 ; // do somthig // do somthig AfxEndThread(exitCode); AfxEndThread(exitCode); return result; return result;}

12 Kończenie wątku funkcja TerminateThread() funkcja TerminateThread() funkcja ExitThread() funkcja ExitThread() instrukcja return – zalecana, pozostałe nie czyszczą stosu. instrukcja return – zalecana, pozostałe nie czyszczą stosu.

13 Programowanie wielowątkowe w C# (1) // współdzielona zmienna // współdzielona zmienna private string _threadOutput = ""; private string _threadOutput = ""; // funkcja pierwszego wątku // funkcja pierwszego wątku void DisplayThread1() void DisplayThread1() { while (_stopThreads == false) { Console.WriteLine("Display Thread 1"); _threadOutput = "Hello Thread1"; Thread.Sleep(1000); // symulacja działania pierwszego wątku Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); } Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); }}

14 Programowanie wielowątkowe w C# (2) // funkcja drugiego wątku void DisplayThread2() void DisplayThread2() { while (_stopThreads == false) { Console.WriteLine("Display Thread 2"); _threadOutput = "Hello Thread2"; Thread.Sleep(1000); // symulacja działania drugiego wątku Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); }}

15 Programowanie wielowątkowe w C# - inicjacja wątków Class1(){ // utworzenie dwóch wątków // utworzenie dwóch wątków Thread thread1 = new Thread(new ThreadStart(DisplayThread1)); Thread thread2 = new Thread(new ThreadStart(DisplayThread2)); Thread thread2 = new Thread(new ThreadStart(DisplayThread2)); // wystartowanie wątków // wystartowanie wątkówthread1.Start(); thread2.Start(); thread2.Start();}

16 Wynik Współdzielona zmienna jest asynchronicznie nadpisywana

17 Synchronizacja przez lock (1) // współdzielona zmienna // współdzielona zmienna private string _threadOutput = ""; private string _threadOutput = ""; // funkcja pierwszego wątku // funkcja pierwszego wątku void DisplayThread1() void DisplayThread1() { while (_stopThreads == false) { lock (this) // blokada na własnej instancji { Console.WriteLine("Display Thread 1"); _threadOutput = "Hello Thread1"; _threadOutput = "Hello Thread1"; Thread.Sleep(1000); // symulacja działania pierwszego wątku Thread.Sleep(1000); // symulacja działania pierwszego wątku Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); }}}

18 Synchronizacja przez lock (2) // funkcja drugiego wątku void DisplayThread2() { while (_stopThreads == false) { lock(this) // blokada na własnej instancji { Console.WriteLine("Display Thread 2"); _threadOutput = "Hello Thread2"; Thread.Sleep(1000); // symulacja działania drugiego wątku Thread.Sleep(1000); // symulacja działania drugiego wątku Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); } } } } }

19 Wynik (po synchronizacji)

20 Synchronizacja przez AutoResetEvent (1) // zmienne sygnałowe do wzajemnego odblokowywania AutoResetEvent _blockThread1 = new AutoResetEvent(false); AutoResetEvent _blockThread2 = new AutoResetEvent(true); void DisplayThread_1() { while (_stopThreads == false) { // pierwszy wątek czeka, gdy drugi działa _blockThread1.WaitOne(); // po wołaniu Set przez drugi wątek, pierwszy kontynuuje działanie // po wołaniu Set przez drugi wątek, pierwszy kontynuuje działanie Console.WriteLine("Display Thread 1"); Console.WriteLine("Display Thread 1"); _threadOutput = "Hello Thread 1"; Thread.Sleep(1000); // symulacja działania pierwszego wątku Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); // zakończenie działania – odblokowanie drugiego wątku // zakończenie działania – odblokowanie drugiego wątku_blockThread2.Set();}}

21 Synchronizacja przez AutoResetEvent (2) void DisplayThread_2() void DisplayThread_2() { while (_stopThreads == false) { // drugi wątek czeka, gdy pierwszy działa _blockThread2.WaitOne(); // po wołaniu Set przez pierwszy wątek, drugi kontynuuje działanie Console.WriteLine("Display Thread 2"); _threadOutput = "Hello Thread 2"; Thread.Sleep(1000); // symulacja działania drugiego wątku Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); // zakończenie działania – odblokowanie pierwszego wątku _blockThread1.Set(); }}


Pobierz ppt "Programowanie wielowątkowe Jarosław Kuchta. Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Windows jest systemem wielowątkowym."

Podobne prezentacje


Reklamy Google