JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Spielschleife [Multithreading]
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dietmar Ferstl
Mini JLI'ler



Anmeldedatum: 19.07.2002
Beiträge: 47
Wohnort: Regensburg/Bayern
Medaillen: Keine

BeitragVerfasst am: 14.06.2004, 20:44    Titel: Antworten mit Zitat

Hallo,

einigen wir uns auf eine Subthread.

Nehmen wir mal an, dieser Thread wird mit: sleep(0) verlassen.
Wie will man denn wissen, wann es in diesem Thread wieder weitergeht?

D.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


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

BeitragVerfasst am: 14.06.2004, 20:44    Titel: Antworten mit Zitat

Windows hat ein Prioritätssystem, dass ganz klaare Regeln vorschreibt.
Es gibt Prioritäten, 5 Glaube ich und diverse Unterprioritäten.
Alle Threads und Prozesse befinden sich in einer Warteschleife, bis der Prozessor nach einer gewissen Zeit (200 Microsekunden glaub ich) den nächsten Kandidaten auswählt. Es werden immer wartende Prozesse mit der höchsten Priorität genommen, erst danach niedriger angesiedelte Prozesse und zum Schluss die idle-Prozesse.
Prozesse, die die höchste Prio. haben sind in der Regel nur Systemprozesse, die sich aber sofort schlafen legen, wenn sie nichts zu tun haben. Anwendungen laufen mit normaler Prio. und diverse Tools mit Idle-Prio. Jeder Thread eines Tasks kann zudem unterschiedlich priorisiert sein (nur mit Unterprioritäten)

Um jedes System Lahmzulegen, muss man nur ein Programm schreiben, dass so viele Threads anlegt, wie es Prozessoren im System gibt und jeder Thread in einer Endlosschleife [ for(;Wink; ] mit der höchsten Priorität verweilt...
_________________
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
Dietmar Ferstl
Mini JLI'ler



Anmeldedatum: 19.07.2002
Beiträge: 47
Wohnort: Regensburg/Bayern
Medaillen: Keine

BeitragVerfasst am: 14.06.2004, 20:49    Titel: Antworten mit Zitat

Hallo,

es geht wesentlich schneller als nur 200 Microsekunden.

Das lässt sich sehr leicht testen, indem man einen Zähler inkrementiert,
und danach sleep(0) aufruft.

Aber das Timesharing ist unter Windows wohl nicht kontrollierbar, oder kennt sich da jemand besser aus?
Ich zumindest habe schon erlebt, dass ein Thread über eine sekunde nicht mehr bedient wurde, weil windows irgendwie im Speicher rumgekrasmt hat. Auslagern, Einlagern und all so'n unnützen Kram halt.

D.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 14.06.2004, 20:53    Titel: Antworten mit Zitat

Dietmar Ferstl hat Folgendes geschrieben:
Hallo,

einigen wir uns auf eine Subthread.

Nehmen wir mal an, dieser Thread wird mit: sleep(0) verlassen.
Wie will man denn wissen, wann es in diesem Thread wieder weitergeht?

D.


Wie kann man einen Thread mit sleep verlassen ? der wird automatisch verlassen sobald man den return befehl aufruft oder keine weiteren anweisungen folgen.

Ansonsten kann man feststellen ob ein thread beendet wurde indem man die übergebenen Variabeln verändert.

Manuell beenden kann man Threads ja auch mit CloseHandle

Man könnte allerdings auch versuchen herauszufinden ob ein sich beendeter Thread sein handla auf 0 setzt.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dietmar Ferstl
Mini JLI'ler



Anmeldedatum: 19.07.2002
Beiträge: 47
Wohnort: Regensburg/Bayern
Medaillen: Keine

BeitragVerfasst am: 14.06.2004, 21:04    Titel: Antworten mit Zitat

FallenAngel84 hat Folgendes geschrieben:


Wie kann man einen Thread mit sleep verlassen ? der wird automatisch verlassen sobald man den return befehl aufruft oder keine weiteren anweisungen folgen.

Nehmen wir mal an wir haben einen Thread, indem nur max alle millisekunde etwas durchgezogen werden soll. Wir lesen also den performancecounter aus, und geben die CPU mittels sleep(0) wieder an andere Prozesse weiter, um performance zu gewinnen.
Das kann man sehr gut kontrollieren.
Aber wie kann man kontrollieren, dass die Zeit nicht z.B. über 2 Millisekunden läuft.

Zitat:

Ansonsten kann man feststellen ob ein thread beendet wurde indem man die übergebenen Variabeln verändert.

klar, aber wir reden ja nicht vom finalen Ende eines Threads.Wink

Zitat:

Manuell beenden kann man Threads ja auch mit CloseHandle

oder endthread, wo dann der mega-stack etc. aufgeräumt wird.

D.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 15.06.2004, 12:38    Titel: Antworten mit Zitat

Ich versteh die Frage immer noch nicht genau, dein Beispiel war nicht grade gut gewählt Wink

Willst du das der Subthread nur alle 2 Millisekkunden anspringt oder was genau ?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dietmar Ferstl
Mini JLI'ler



Anmeldedatum: 19.07.2002
Beiträge: 47
Wohnort: Regensburg/Bayern
Medaillen: Keine

BeitragVerfasst am: 15.06.2004, 12:41    Titel: Antworten mit Zitat

nein,
der subthread soll allerspätesten 2 Millisekunden nachdem dieser thread die CPU mit sleep(0) weitergereicht hat, wieder angesprungen werden.

Und das ist leider nicht bewerkstelligenbar. Zumindest nicht für einen Newbie wie mich.Sad
Oder ?

D.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 15.06.2004, 12:44    Titel: Antworten mit Zitat

Ich glaub nicht das dies möglich ist da ja das OS bzw. der Prozessor die Rechenzeiten einteilt. Man könnte allerhöchstens die ThreadPriorität steigern und hoffen das dies etwas bringt.

Aber was sind schon 2 Millisekunden Wink
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dietmar Ferstl
Mini JLI'ler



Anmeldedatum: 19.07.2002
Beiträge: 47
Wohnort: Regensburg/Bayern
Medaillen: Keine

BeitragVerfasst am: 15.06.2004, 13:05    Titel: Antworten mit Zitat

FallenAngel84 hat Folgendes geschrieben:
Aber was sind schon 2 Millisekunden Wink


normalerweise wird zu 99,9 % der Thread binnen ca. 10 Microsekunden wieder angesprungen. Leider kann es aber auch mal bis zu einer Sekunde dauern und länger. Sad

D.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 15.06.2004, 13:44    Titel: Antworten mit Zitat

Wenn du auf sowas achtest musst du ja mit zeitkritischen Ablüfen arbeiten. Wenn das wirklich so ist und du eine kritische Zeitkontrolle hast sollte man da schon mit Zeitanpassungsformeln arbeiten (deltaTime und Co.)
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dietmar Ferstl
Mini JLI'ler



Anmeldedatum: 19.07.2002
Beiträge: 47
Wohnort: Regensburg/Bayern
Medaillen: Keine

BeitragVerfasst am: 15.06.2004, 14:56    Titel: Antworten mit Zitat

Hi,

das nützt einem leider nichts, falls eine Reaktion erst ausserhalb der Toleranzzeit stattfinden kann.

D.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


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

BeitragVerfasst am: 16.06.2004, 08:24    Titel: Antworten mit Zitat

In einer Einprozessor-Multiprozess-Umgebung kann dir NIEMAND garantieren, dass dein Thread nach einer von dir festgelegten Zeit 100%ig wieder drann ist. Erst wenn mehr Prozessoren als Threads zur verfügung stehen, kann man zimlich sicher sein, dass dein Thread ständig einen Rechenbereiten Prozessor findet bzw. besitzt. Dies ist heutzutage aber noch nicht der Fall...
Außerdem ist dann immernoch das Problem der begrenzten Ressourcen - zwei Prozesse können eben nicht zur gleichen Zeit die Festplatte nutzen, die arbeitet nun mal nur sequentiell (wenn auch schon mit ansehnlicher Geschwindigkeit, aber eben nicht so schnell wie ein Prozessor mir direken Ram-Zugriff)
_________________
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
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 07.08.2004, 00:22    Titel: Antworten mit Zitat

AFE-GmdG hat Folgendes geschrieben:
Ein Programm, dass Singlethreaded Kompiliert wurde, belegt *immer* genau einen Task mit einem Thread.
Programme können auch Multithreaded kompiliert werden, dann wird gegen andere WindowsAPI-Funktionen gelinkt, nämlich gegen Funktionen, die Multithread-Sicher sind. Sie sind in der Regel etwas langsamer, da Sicherheitsmechanismen eingebaut sein müssen.

Was bedeutet denn Multithread-Sicher?
Ich hab ein Programm, welches im Hauptthread Direct3D Szenen rendert und im Hintergrund Ressourcen lädt.
Ich konnte das Programmm sowohl mit den Singlethreading Libraries kompilieren und ausführen, als auch mit den Multithreading Libraries.

Was bringen mir die Multithreading Libraries also für Vorteile?

P.s. Habe Direct3D mit D3DCREATE_MULTITHREADED initialisiert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 07.08.2004, 23:15    Titel: Antworten mit Zitat

Der Flag D3DCREATE_MULTITHREADED sorgt dafür das bestimmte interne DirectX Daten und Funktionen sicher gemacht werden, wodurch es unmöglich für andere threads ist darauf zuzugreifen, das sieht ungefähr so aus:

Code:
void SichereFoo()
{
  MachSicher(...);
  DoStuff();
  MachUnsicher();
}


so kann kein anderer thread daten verändern die in der Funktion Sicher gemacht wurden das verhindert das bestimmte daten benutzt werden obwohl die daten schon von einem anderen Thtread manipuliert wurden.

Edit: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/critical_section_objects.asp
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 07.08.2004, 23:22    Titel: Antworten mit Zitat

Danke für die Antwort. Very Happy

Und was weißt du über die Laufzeitbibliothek, die man bin der Rubrik Codeerstellung in den Eigeschaften des Projektes einstellen kann?

Da kann man ja zwischen ML(Singlethreaded) und MT(Multithreaded) wählen. Da ich 2 Threads verwende, habe ich mich gewundert, dass man das Projekt auch mit der Parameter ML(Singlethreaded) kompilieren kann....

Ich wollte wissen, ob ich nicht besser MT benutzen sollte..?

Danke für den Link... vielleicht beantwortet der ja schon meine Frage. Smile
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
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