|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 28.07.2002, 12:02 Titel: Noch mehr Threads |
|
|
Hallo allerseits,
Ich hoffe, Ihr könnt mir helfen...
Für die Syncronisation zwischen den einzelnen Threads habe ich Mutex-Objekte verwendet.
Mit der Funktion WaitForSingleObject(hMutex, INFINITE); sollte ein Mutex gesperrt werden. Statt INFINITE kann man auch ein Timeout setzen (Millisekunden)
Wenn jetzt ein anderer Prozess diese Funktion aufruft, sollte der Prozess warten, bis hMutex wieder freigegeben wurde. (Bei INFINITE sollte er Unendlichlange warten)
Freigenen funktioniert duch ReleaseMutex(hMutex);.
Nun habe ich 2 Threads: 1. Den HauptThread und 2. den Arbeitsthread, der die Grafischen Zeichnet.
Wenn mein Programm jetzt beendet werden soll, habe ich folgende Testsituhation eingerichtet:
Thread 1
Code: |
BOOL CWinApp::Run() {
MSG msg;
DWORD ThreadID;
WaitForSingleObject(m_hRunMutex, INFINITE); // Mutex setzen.
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) RenderProcedure, this, 0, &ThreadID);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ReleaseMutex(m_hRunMutex);
WaitForSingleObject(m_hThreadMutex, INFINITE);
return(TRUE);
}
|
Thread 2
Code: |
DWORD CWinApp::Render() {
// Diese Funktion läuft in einem eigenem Thread.
WaitForSingleObject(m_hThreadMutex, INFINITE); // Mutex setzen.
while(WaitForSingleObject(m_hRunMutex, 25L)==WAIT_TIMEOUT) {
// Hauptrenderschleife, Code entfernt da er nichts mit dem Problem zu tun hat.
}
// ReleaseMutex(m_hThreadMutex); // <-- DIESER MUTEX MÜSSTE FREIGEGEBEN WERDEN, DAMIT DER 1. THREAD NICHT EWIG WARTEN MUSS.
return(0);
|
Wie Ihr seht, habe ich den ReleaseMutex-Aufruf im 2. Thread auskommentiert. Daher sollte der 1. Thread nach der Freigabe von m_hRunMutex ewig am WaitForSingleObject(m_hThreadMutex, INFINITE);
warten, aber genau das macht er nicht. Werden Mutex-Objekte vielleicht Automatisch zurückgesetzt, wenn ein Thread beendet wird, der ihn gesetzt hat? Das wäre sehr unschön, da ich warten muß, bis der Arbeitsthread beendet ist, bevor ich das Hauptfenster zerstören will.
Die Hauptnachrichtenschleife verlasse ich durch ein PostQuitMessage(0)
Ist es vielleicht auch Sinnvoll, die beiden Threads auszutauschen, d. heißt, daß ich die Hauptnachrichtenschleife im 2.Thread laufen lasse und die Renderfunktion im 1. Thread? _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 30.07.2002, 18:30 Titel: |
|
|
Hat hier keiner eine Idee oder ist das Thema zu schwer auch für die besseren Programmierer hier?
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 30.07.2002, 19:24 Titel: |
|
|
Also für mich ist es zu schwer, aber wenn die anderen es nicht wissen, denn tut es Christian vielleicht! |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 31.07.2002, 08:28 Titel: |
|
|
Ich hab zwar noch nie mit Threads gearbeitet aber bist du dir mit der Reihenfolge sicher? Beim ersten Thread, hat du zuerst Mutex, dann den Thread erstellt. Gehört das nich andersrum?
PS:
Benutzt du MFC? Falls ja, hab ich mal wo gelesen, dass das bisschen Schnelligkeit das man durch die mehreren Threads herausbekommt fast durch den ganzen overhead der MFC wieder ausgeglichen wird... |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 31.07.2002, 18:14 Titel: |
|
|
Nein, ich benutze MFC nicht, zumal ich ja DirectX programmieren will. MFC hat eh mit DirectX nicht viel am Hut...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 03.08.2002, 20:47 Titel: |
|
|
Ich bin da auch überfragt... geh am besten zum USF or DSB, die kann dir *SICHERLICH* geholfen werden. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 09.08.2002, 07:45 Titel: |
|
|
Mal ne Frage: Welche Bücher benutzt du? Ich will das mit den Threads auch gerne mal lernen habe aber keine Bücher darüber und Onlinetuts die gut und ausführlich genug sind kenne ich auch ned. _________________ Es geht auch ohne |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 09.08.2002, 18:32 Titel: |
|
|
Bücher, die sich direkt mit dem Thema Multithreading auseinandersetzen hab ich nicht. Ein kurzer Absatz befindet sich in "Inside Visual C++" Version 5 oder höher. Da sich dieses Buch (Microsoft Press) aber nur mit der MFC auseinandersetzt, und ich nicht sonderlich viel dafür übrig hab, war der Abschnitt dort nicht gerade Lehrreich im Bezug auf Threads. Aber in der MSDN hab ich was sehr brauchbares gefunden, das führte mich auch gleich in die Benutzung der Mutexe ein.
MSDN: Visual C++-Dokumentation - Arbeiten mit Visual C++ - Visual C++-Programmierhandbuch - Hinzufügen von Programmfunktionen - Details - Multithreading Themen - Multithreading bei C und Win32 - Beispiel eines Multithreading-C-Programmes
Puh - langer Pfad...
Das auf dieser Seite abgebildete Programm hat einen kleinen Programmierfehler, in der Funktion WriteTitle() muß ein wenig mehr Speicherplatz für die char-Variable vergeben werden, sonst stürtzt das Programm beim Testlauf ab. Alternativ dazu kann natürlich auch der Text eingekürzt werden...
Ansonsten hab ich das meiste durch probieren herausbekommen. Mein DirectX-Programm verwendet inzwischen 3 Threads: Einer für die Nachrichtenhauptschleife (Mit GetMessage und nicht mit PeekMessage), einer, der das Zeichnen der Szene übernimmt, und einer, der die Eingabegeräte überwacht. Ein weiterer Thread wird noch für die Sound und Musikunterstützung programmiert, aber den hab ich noch nicht angefangen. Das Beste an der Arbeit mit den Threads ist jedoch, daß die Prozessorauslastung bei vollem Spielverlauf nichtmal 5% erreicht, da ich keine Prozessorlastigen Endlosschleifen programmieren mußte, die jede Sekunde ca. 100000 Durchlaufen werden. Alle Threads haben eigene Warte- und Zeitsteuerfunktionen, da die Aufgabenbereicht nicht nacheinander, sondern parallel abgearbeitet werden können.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|