WINDOWS OPERATIVSYSTEM LABORATIONSUPPGIFTER ALLMÄNT Kursens laborationsdel består av sex uppgifter. För att få laborationsdelen av kursen godkänd krävs att alla sex uppgifter löses. Den sista uppgiften finns i två olika varianter. En variant är enklare och en är mer krävande. Den som löser den svårare varianten av uppgift 6 får betyg fyra eller fem på kursens laborationsdel. Den som istället väljer den enklare versionen får betyg tre. För alla uppgifter utom uppgift 3 och 6 finns det mallprogram på kursens webbsida. Mallprogrammen är exekverbara filer som visar hur lösningarna ska se ut när de är klara. Laborationerna ska utföras individuellt. Uppgifterna ska lösas med verktyget Microsoft Visual C++. Programmera direkt mot Windows API i C eller C++. Använd de grundläggande biblioteken GDI, USER och KERNEL. Det är inte tillåtet att använda mallsystemet ATL, klassbiblioteket MFC, plattformen.net eller andra dylika hjälpmedel. Redovisa laborationerna genom att visa upp det för mig i skolan under någon av laborationstillfällena. För uppgift 2 samt uppgift 6 för betyg 4 eller 5, ska även källkoden redovisas. Då gäller följande: Redovisa först lösningens funktionalitet i skolan. När funktionaliteten är godkänd ska källkoden skickas till mig (mattias@itmattias.com). Gör ett zip-arkiv av hela projektkatalogen, men utelämna underkatalogerna debug och release. Låt ämnesraden i emailet vara labb 2 eller labb 6 respektive. Ifall källkoden är i sin ordning skickar jag tillbaka ett email som talar om att laborationen är godkänd. Det arbete som krävs för att lösa uppgifterna varierar stort mellan de olika uppgifterna. Uppgift 1 är en liten uppgift för att komma igång. Uppgift 2 är mer omfattande än alla de andra uppgifterna tillsammans. Försök därefter att börja jobba med uppgift 2 så snabbt som möjligt. Ifall sedan uppgift 2 drar ut på tiden, lös de andra uppgifterna samtidigt som du jobbar på uppgift 2. 1
KURSENS BETYGSÄTTNING Slutbetyg på hela kursen beräknas efter följande tabell: Laborationer Tentamen Hela kursen 3 3 3 3 4 3 3 5 4 4 3 4 4 4 4 4 5 5 5 3 4 5 4 5 5 5 5 2
UPPGIFT 1 GUL CIRKEL Syftet med den här uppgiften är att komma igång med C programmering i Windows miljö. Bekanta sig med utvecklingsverktyget Visual C++ och dokumentationen MSDN, samt att lära sig grunderna i det Windows GUI-programmering. Gör en applikation med ett vanligt standardfönster. När användaren rör muspekaren över fönstret ska en cirkel målas under muspekaren. När muspekaren lämnar fönstret stannar cirkeln. Det finns ett mallprogram som visar hur lösningen ska se ut när den är klar. Använd MSDN för att ta reda på hur man ritar cirkeln. Windows funktioner för programmering av användargränssnitt finns i biblioteken GDI och USER. För att uppgiften ska godkännas krävs följande: Färgerna ska överrensstämma med mallprogrammet gul cirkel och knapp-grå bakgrund. När muspekaren lämnar fönstret stannar cirkeln. Cirkeln får inte ha en svart kant. 3
UPPGIFT 2 POÄNGTAVLA Syftet med laborationen är att lära sig programmera användargränssnitt med Windows API. Det finns ett mallprogram i en fil som heter 2_poängtavla.exe. Uppgiften består helt enkelt av att göra ett program som fungerar som mallprogrammet. Programmet kan användas som en poängtavla vid exempelvis dartspel. Där finns en dialog där användaren kan mata in namn på deltagare. Det går sedan att rita streck på poängtavlan med en funktion som härmar en krita. Genom att klicka på musens högerknapp kan man byta kritan till en tavelsudd. Det finns även en registreringsdialog. Ingenting registreras dock när man använder dialogen. Däremot har dialogen två speciella egenheter. 1. Ifall man avmarkerar checkboxen för email blir OK-knappen otillgänglig i tre sekunder. Sedan markeras checkboxen automatisk och OK-knappen blir åter tillgänglig. 2. Avbryt-knappen går att flytta runt i dialogen. Man drar och släpper Avbrytknappen med musens högerknapp. Det är godkänt att Avbryt-knappen uppför sig konstigt när man lägger den ovanpå en annan control. När man gör ett användargränssnitt måste man ofta lägga ned relativt stort arbeta på den sista finishen. Det kan ibland vara knepigt att få gränssnittet att uppföra sig exakt som man vill. Därför är detaljerna viktiga. För att få godkänd får det inte finnas några fel eller skavanker. Några detaljer som jag kontrollerar innan uppgiften blir godkänd: Tabbordningen i dialogerna Vilken control i dialogerna som har fokus när dialogen öppnas. Vilken knapp som är default. Hur applikationen uppför sig när man med musknappen nedtryckt rör muspekaren in och ut ur de områden i fönstret som det går att rita streck på. Huruvida rullningslisterna hänger med när man lägger till och tar bort deltagare. Att Avbryt-knappen inte hoppar när man tar tag i den föra att flytta den. 4
UPPGIFT 3 MINNESKAMIKAZE Syftet med uppgiften är att få en känsla för hur Windows virtuella minne fungerar. För den här uppgiften finns det inget mallprogram. Istället finns det nedan en exakt beskrivning av hur programmet ska fungera. Med hjälp av programmets output ska nedanstående frågor besvaras. Skriv ner svaren direkt på det här pappret innan du redovisar laborationen. Gör en applikation som allokerar minnesblock om 1 Mbyte. Applikationen ska allokera minne en Mbyte åt gången tills det inte går att allokera mer minne. Efter varje allokering ska följande information skrivas ut: 1. Totala storleken på processens virtuella minne. 2. Mängden ledigt virtuellt minne. 3. Totala storleken på datorns RAM-minne. 4. Mängden ledigt RAM-minne. 5. Totala storleken på Windows page-fil. 6. Mängden lediga bytes i page-filen. När det inte går att allokera mer minne. Låt applikationen skriva felkoden som det misslyckade malloc anropet ger upphov till. Slå upp felkoden i MSDN. 5
Frågor: a) Vad är det för felmeddelande man får när det inte går att allokera mer minne: b) Vad är det som begränsar hur mycket minne som går att allokera? c) Hur kan man göra för att ta bort begränsningen? Gör konfigurationen som tar bort begränsningen och kör därefter programmet igen. d) Vad blir det för felmeddelande den här gången? e) Vad är det som begränsar hur mycket minne som går att allokera? 6
UPPGIFT 4 MUTEXCHAT Syftet med uppgiften är att lära sig hur Windows funktioner för synkronisering och för delat minne fungerar. Applikationen som skapas i laborationen utövar interprocess kommunikation med hjälp av ett filemapping-objekt, ett event-objekt samt ett mutexobjekt. Mallapplikationen består av en dialog med en inmatningsruta, en visningsruta samt en knapp. När man trycker på knappen läggs texten i inmatningsrutan till den text som visas i visningsrutan. Ifall flera instanser av applikationen startas igång kommer de alla att visa samma text. Den text som matas in i en av dialogerna visas i alla dialoger. Lösningen på uppgiften ska fungera på samma sätt som, och tillsammans med mallprogrammet. Kommunikationen mellan dialogerna går till på följande sätt: Filmapping-objektet heter text och innehåller hela den text som visas i dialogernas visningsfält. Filmappnings-objektet har en max-storlek på 10000 bytes. Mutex-objektet heter textmutex och kontrollerar åtkomst till filmappingobjektet, så att inte flera trådar använder det samtidigt. Event-objektet heter nytt meddelande och signaleras när det finns ett nytt meddelande. Event-objektet är inte av typen automatiskt. Det betyder att ifall en tråd väntar på eventet så kommer event-objektet inte automatiskt att flaggas av när tråden släpps igång. Algoritmen för uppdatering av visningsfältet: 1. Vänta på att event-objektet nytt meddelande ska flaggas. 2. Vänta på att få ägarskap över mutex-objektet textmutex. 3. Lägg in textsträngen som ligger i filmappningsobjektet text dialogens visningsfält. 4. Släpp ägandeskapet över mutex-objektet. 5. Börja om ifrån 1 igen. Algoritmen för vad som händer när användaren matar in text i dialogen: 1. Vänta på att knappen i dialogen klickas. 2. Vänta på ägarskap över mutex-objektet textmutex. 3. Lägg innehållet i inmatningsfältet till slutet av textsträngen i filmappningsobjektet text. 4. Lägg till tecknen för ny rad till textsträngen i filmappningsobjektet. 5. Flagga event-objektet nytt meddelande. Använd funktionen PulseEvent så att event-objektet flaggas av igen när alla väntande trådar släppts. 6. Rensa inmatningsfältet och sätt fokus på det samma. 7. Släpp ägandeskapet över mutex-objektet. 8. Börja om ifrån 1 igen. 7
Tänk på att applikationen måste fler än en tråd för att kunna fungera. 8
UPPGIFT 5 PROCESSRACE Mallapplikationen till den här uppgiften tar en parameter n som är ett heltal. Applikationen startar n antal barnprocesser. Varje barnprocess går runt en miljard gånger i en loop och avslutas sedan. I ett fönster visas hur långt varje barnprocess har kommit i sitt räknande, med en linje för varje process. Följande gäller: Den första av barnprocesserna ska alltid ha en prioritet som är satt till lägre än normalt. Alla andra processer har normal prioritet. Ifall ingen parameter anges ska tre barnprocesser startas. Mallen för den här laborationen består bara av en exekverbar fil, men det går bra att lösa uppgiften med två delprogram. Det kan också finnas en fast övre gräns på antalet barnprocesser. 9
UPPGIFT 6 FÖR BETYG 3 FJÄRRKONTROLL Väljer du att göra den här varianten av uppgift 6 får du betyg 3 på laborationsdelen av kursen. I den här laborationen används Windows bibliotek för kommunikation med TCP/IPprotokollet. I laborationen ska vi skapa en server som kommunicera med flera klienter. Både servern och klienten ska rymmas i samma exe-fil. När programmet startas får användaren välja ifall det är en klient eller en server som ska startas. Ifall det är en server som ska köras ska användaren ange vilken port som servern ska lyssna på. När en klient skapas, ska användaren ange ip-adress och port för kontakt med servern. Både servern och klienten har ett fönster av standard typ. För varje klient som kopplar upp sig syns en falsk muspekare i serverns fönster. När muspekaren rör sig i klientens fönster rör sig dess motsvarighet hos servern på samma sätt. Använd dig av biblioteket Winsock. När man använder TCP beter sig Winsock på det sättet att små meddelanden inte skickas iväg direkt utan först samlas ihop. I vårt fall vill vi att alla meddelanden ska gå iväg direkt för att det inte ska bli lagg i programmet. Det går att åstadkomma med Winsock-funktionen setsockopt. Det går även bra att använda UDP. UPPGIFT 6 FÖR BETYG 4 ELLER 5 NÄTVERKSSPEL Gör ett nätverksspel för flera deltagare. Spelarna ska kunna sitta vid olika datorer och spela med varandra. Ifall du löser den här uppgiften får laborationsdelen av kursen betyg 4 eller betyg 5. Vilket betyg det blir beror på hur omfattande jag bedömer att spelet är. Läs kommentaren om Winsock i uppgiften för betyg 3. Det som står där gäller förstås även här. 10