====== Synchronizacja wątków ====== ===== Zadanie 1 - Komunikator tekstowy z wieloma klientami c. d. ===== Rozszerz aplikację z poprzednich zajęć w następujący sposób: * w momencie wyczerpania wszystkich możliwych połączeń wątek główny serwera czeka na zakończenie przynajmniej jednego z wątków odpowiedzialnych za połączenia z klientami. Dopiero wtedy możliwe staje się ponowne zaakceptowanie nowego połączenia. Wykorzystaj w tym celu funkcję [[https://msdn.microsoft.com/en-us/library/ms687025%28v=vs.85%29.aspx|WaitForMultipleObjects]] * po uruchomieniu serwera przyciskiem ''Run'' ten sam przycisk pozwala wyłączyć serwer. W momencie wyłączenia serwera do wszystkich połączonych klientów prześlij komunikat pożegnalny i zakończ wątki odpowiedzialne za połączenia oraz wątek główny serwera. Do komunikacji między wątkami wykorzystaj [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms686360%28v=vs.85%29.aspx#event_functions|zdarzenia]]. Przydatne funkcje: * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms682396%28v=vs.85%29.aspx|CreateEvent]] tworzy uchwyt do obiektu zdarzenia * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms686211%28v=vs.85%29.aspx|SetEvent]] ustawia obiekt zdarzenia w stanie sygnalizującym zajście zdarzenia * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms685081%28v=vs.85%29.aspx|ResetEvent]] przywraca pierwotny stan zdarzenia * [[https://msdn.microsoft.com/en-us/library/ms687032%28v=vs.85%29.aspx|WaitForSingleObject]] * zabezpiecz dane modyfikowane przez wątki tak aby wyłącznie jeden wątek mógł modyfikować i odczytywać współdzielone zasoby (np. zmienne globalne). Wykorzystaj w tym celu [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms686360%28v=vs.85%29.aspx#critical_section_functions|sekcje krytyczne]]. Przydatne funkcje: * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms683472%28v=vs.85%29.aspx|InitializeCriticalSection]] * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms684169%28v=vs.85%29.aspx|LeaveCriticalSection]] * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms682608%28v=vs.85%29.aspx|EnterCriticalSection]] * [[https://msdn.microsoft.com/en-us/library/windows/desktop/ms682552%28v=vs.85%29.aspx|DeleteCriticalSection]] Uruchom aplikację w debuggerze Visual Studio i prześledź działanie wątków oraz możliwości VS w śledzeniu działania aplikacji wielowątkowych. Źródła: * szablon aplikacji serwerowej {{zajecia:winprog_2015_2:czat_serwer2.cpp}} * przykładowa aplikacja kliencka, którą można wykorzystać do testów {{zajecia:winprog_2015_2:czat_klient.cpp}}