JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=864086efe7ba9bbf181326500e220adfMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Noch mehr Threads

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 28.07.2002, 13:02    Titel: Noch mehr Threads Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 30.07.2002, 19:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 30.07.2002, 20:24    Titel: Antworten mit Zitat

Also für mich ist es zu schwer, aber wenn die anderen es nicht wissen, denn tut es Christian vielleicht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 31.07.2002, 09:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 31.07.2002, 19:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 03.08.2002, 21:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael
JLI'ler



Anmeldedatum: 20.07.2002
Beiträge: 173
Wohnort: Münster / NRW
Medaillen: Keine

BeitragVerfasst am: 09.08.2002, 08:45    Titel: Antworten mit Zitat

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 Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 09.08.2002, 19:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum