Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

A RBEITEN MIT T HREADS. P ROZESSE UND T HREADS Prozess Eine einzelne CPU kann immer nur einen einzelnen Prozess bearbeiten. Rechenzeit wird an Prozesse.

Ähnliche Präsentationen


Präsentation zum Thema: "A RBEITEN MIT T HREADS. P ROZESSE UND T HREADS Prozess Eine einzelne CPU kann immer nur einen einzelnen Prozess bearbeiten. Rechenzeit wird an Prozesse."—  Präsentation transkript:

1 A RBEITEN MIT T HREADS

2 P ROZESSE UND T HREADS Prozess Eine einzelne CPU kann immer nur einen einzelnen Prozess bearbeiten. Rechenzeit wird an Prozesse vom Betriebssystem vergeben, auf Basis ihrer Priorität. (Scheduling) Thread Threads sind Teile eines Prozesses. Ein Prozess kann eine beliebige Anzahl Threads enthalten. Im Gegensatz zu Prozessen können Threads Speicher teilen.

3 P ROZESSE UND T HREADS 2

4 T HREADS IN DER S PIELEPROGRAMMIERUNG Threads werden grundsätzlich dann benutzt wenn mehrere Dinge gleichzeitig passieren sollen. Threads ermöglichen das Laden von Ressourcen im Laufenden Spielbetrieb

5 D IE T HREAD -F UNKTION Die Thread-Funktion ist mit der Main-Funktion vergleichbar Unter Windows ist der Typ der Thread Funktion DWORD WINAPI mit einen erwarteten LPVOID Parameter.

6 D IE T HREAD -F UNKTION (C ODE ) DWORD WINAPI Thread1(LPVOID pParameter) //Bsp.-Thread 1 { for(int i = 0; <= 10000; i++) printf( Thread 1 sagt: %d\n, i); //0-10000 anzeigen // Thread beenden. Der Rückgabewert gibt normalerweise Aufschluss darüber, ob ein Fehler auftrat. 0 steht für Alles OK. return 0; } DWORD WINAPI Thread2(LPVOID pParameter) //Bsp.-Thread 2 { for(int i = 0; <= 10000; i++) printf( Thread 1 sagt: %d\n, i); return 0; }

7 E RZEUGUNG EINES T HREADS ParameterBeschreibung LPSECURITY_ATTRIBUTES Lp ThreadAttributes Hier: Nicht weiter wichtig. Wird mit NULL angegeben. SIZE_T dwStackSize Legt die Stackgröße für den Thread fest. Bei NULL wird die Standartgröße verwendet. LPTHREAD_START_ROUTINE lpStart Hier wird die Thread-Funktion angegeben. Der Parameter ist ein Pointer auf eine Funktion vom Typ DWORD WINAPI LPVOID lpParamter Der hier verwendete Wert wird an die Thread- Funktion übergeben. NULL ist zulässig. DWORD dwCreationFlags Ermöglicht es den Thread direkt zu starten ( NULL) oder erst durch den Aufruf durch eine andere Funktion ( CREATE_SUSPENDED ) LPWORD lpThreadId Pointer auf einen DWORD -Wert der die ID des Threads erhält. Sollte aufgrund von Problemen mit Windows 95/98/Me auch dann nicht NULL sein wenn keine ID benötigt wird. Funktion CreateThread wird in der Win-API zur Verfügung gestellt. Die Funktion besitzt die folgenden Parameter:

8 E RZEUGUNG EINES T HREADS (CODE) HANDLE ist ein Rückgabewert der den Handle des erstellten Threads ausgibt, durch den dieser eindeutig zu Identifizieren ist. Sozusagen der Name des Threads. HANDLE hThread1, hThread 2; DWORD dwThread1, dwThread2; //Zwei Threads Erzeugen hThread1 = (CreateThread(NULL, 0, Thread1, NULL, 0, &dwThread1); hThread2 = (CreateThread(NULL, 0, Thread2, NULL, 0, &dwThread2);

9 V ERWALTUNGSFUNKTIONEN VON T HREADS Mögliche Operationen sind: Thread beenden Threads anhalten und fortsetzen Threads schlafen legen Setzen der Thread Priorität: THREAD_PRIORITY_TIME_CRITICAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_LOWEST THREAD_PRIORITY_IDLE

10 P ROBLEM : T HREAD -S YNCHRONISIERUNG Während es gegenüber Prozessen für Threads möglich ist auf den gleichen Speicherbereich zuzugreifen bringt dieser Vorteil auch die ein oder andere Gefahr mit sich. Zumeist wird so programmiert, dass Threads auf Signale anderer Threads, in denen diese ihren Status mitteilen, warten müssen. Probleme wie das folgende Beispiel werden dadurch alleine jedoch nicht behoben.

11 L ÖSUNG : C RITICAL S ECTIONS Eine Critical-Section ist eine Art Schutzkapsel um kritische Daten. Vgl. pPlayer Die Critical-Section wird im Hauptprogramm als Variable vom Typ CRITICAL_SECTION mit der Funktion InitializeCriticalSection erstellt. Um nun Daten innerhalb einer Critical Section verändern zu können muss ein Thread die EnterCriticalSection Funktion aufrufen. Wenn der Thread fertig ist muss er die LeaveCriticalSection Funktion aufrufen. Ruft ein Thread nun eine Critical Section auf, die bereits von einem anderen Thread verändert wird. Muss der Prozess warten und wird bis die Critical Section wieder frei ist vom Betriebssystem schlafen gelegt. Mit DeleteCriticalSection wird eine Critical Section entfernt. LeaveCriticalSection(&CS);

12 E VENTS Events sind die erwähnten Signale, mit deren Hilfe Threads aufeinander abgestimmt werden können. Events bieten Möglichkeiten Rechenzeit zu sparen. Events werden mit CreateEvent erzeugt und durch eine HANDLE Variable beschrieben. CloseHandle löscht ein Event. WaitForSingleObject lässt einen Thread auf ein Eventsignal warten. Hierbei kann eine Zeit in ms spezifiert werden oder auch INFINITE gewählt werden.

13 E VENTS 2 ParameterBeschreibung LP_SECURITY_ATTRIBUTES lpEventAttributes Wie zuvor: Nicht wichtig -> NULL BOOL bManualReset Ermöglicht es das automatische Resetten von Events zu stoppen (true). Das Event muss dann mit ResetEvent von Hand zurückgesetzt werden. BOOL bIntitalState Gibt den ursprünglichen Status des Events an. True = das Event wurde signalisiert. False (default) = das Event wurde nicht signalisiert. LPCTSTR lpName


Herunterladen ppt "A RBEITEN MIT T HREADS. P ROZESSE UND T HREADS Prozess Eine einzelne CPU kann immer nur einen einzelnen Prozess bearbeiten. Rechenzeit wird an Prozesse."

Ähnliche Präsentationen


Google-Anzeigen