AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Threads: optimale Nutzen/Prozessorleistung-Optimierung
Thema durchsuchen
Ansicht
Themen-Optionen

Threads: optimale Nutzen/Prozessorleistung-Optimierung

Ein Thema von Thorus · begonnen am 30. Mär 2005 · letzter Beitrag vom 1. Apr 2005
Antwort Antwort
Seite 1 von 3  1 23      
Thorus

Registriert seit: 3. Jul 2004
23 Beiträge
 
Delphi 2005 Personal
 
#1

Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 14:29
Hallo,

ich habe einen Thread, der das tut was er soll. Das Problem ist nur, dass die Prozessorleistung immer auf 100% ist.
Code:
uses rdtsc;

procedure TMyThread.Execute;
var
  Zeit:int64;
begin
  Zeit := cpuGetTick;
  while not Terminated do
  begin
    if cpuGetMs(Zeit) > 9 then
    begin
      Zeit := cpuGetTick;
      Synchronize(TueEtwas);
    end;
  end;
end;
Dieser Thread ruft die Methode TueEtwas maximal so 100 mal in der Sekunde auf.
Ich hatte auch probiert vor "if cpuGet.." Sleep(1) zu setzen. Dies funktioniert zwar, ist aber viel zu langsam. Mit Sleep war die Prozessorbelastung aber minimal, so wie es sein sollte.
75-100 mal pro Sekunde sollten es schon sein.

Das Problem bei Sleep ist auch, dass, wenn für das auszuführende TueEtwas 10 ms verbraucht werden, dann wartet er mit Sleep trotzdem noch eine Weile, obwohl TueEtwas eigentlich sofort wieder ausgeführt werden sollte.

Wenn Sleep(1) wirklich nur 1 ms brauchen würde, wär das ja ok, aber das tut es wohl nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 14:35
Zitat von Thorus:
Hallo,

ich habe einen Thread, der das tut was er soll. Das Problem ist nur, dass die Prozessorleistung immer auf 100% ist.
Code:
uses rdtsc;

procedure TMyThread.Execute;
var
  Zeit:int64;
begin
  Zeit := cpuGetTick;
  while not Terminated do
  begin
    if cpuGetMs(a1) > 9 then
    begin
      Zeit := cpuGetTick;
      Synchronize(TueEtwas);
    end;
  end;
end;
Dieser Thread ruft die Methode TueEtwas maximal so 100 mal in der Sekunde auf.
Warum hast du dafür einen Thread, wenn du doch alles im Kontext des Hauptthreads deines Fensters ausführst? Dein Problem ist einfach ein Designfehler.

Zitat:
Ich hatte auch probiert vor "if cpuGet.." Sleep(1) zu setzen. Dies funktioniert zwar, ist aber viel zu langsam. Mit Sleep war die Prozessorbelastung aber minimal, so wie es sein sollte.
75-100 mal pro Sekunde sollten es schon sein.

Das Problem bei Sleep ist auch, dass, wenn für das auszuführende TueEtwas 10 ms verbraucht werden, dann wartet er mit Sleep trotzdem noch eine Weile, obwohl TueEtwas eigentlich sofort wieder ausgeführt werden sollte.
Hier fehlt wohl das Verständnis, was Sleep eiegntlcih macht. Deswegen: MSDN-Library durchsuchenSleep.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Thorus

Registriert seit: 3. Jul 2004
23 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 15:03
Ich hatte mir einige Beiträge hier im Forum durchgelesen und das mit sleep im Thread gefunden. Wie das funktioniert, wusste ich wirklich nicht. Und in der Delphi-Hilfe hatte ich nichts gefunden.
So wie ich es bei MSDN gelesen habe, ist sleep also äußerst ungünstig dafür?

Zitat:
Warum hast du dafür einen Thread, wenn du doch alles im Kontext des Hauptthreads deines Fensters ausführst? Dein Problem ist einfach ein Designfehler.
Ich verstehe leider nicht, wieso das falsch ist, bzw wie ich es anders machen sollte. Ich habe einiges durchsucht, um das richtige zu finden, bin aber leider nicht fündig geworden. Dein Turturial hatte ich auch mal vor einiger Zeit durchgelesen und fand es sehr informativ, aber eine Delphi-Umsetzung dafür war glaube ich nicht dabei.

Im Multimedia-Forum hatte ich auch was über GameLoop und Threads gelesen. GameLoop bedeutet ja gerade, dass so eine Schleife ständig ausgeführt wird.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 15:48
Du führst eine Prozedur immer wieder aus, nicht mehr. Dafür sind Threads eigentlich Overkill ...
Du könntest stattdessen genausogut eine Entsprechende Schleife im Hauptthread machen, ab und zu Application.ProcessMessages und gut ist.

Du könntest auch einen Timer für diese Aufgabe nehmen, beachte aber, dass dieser nur eine Auflösung von ~20 ms hat.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 15:50
Zitat von Thorus:
Ich verstehe leider nicht, wieso das falsch ist, bzw wie ich es anders machen sollte.
Na das: Synchronize(TueEtwas); sorgt dafür das die Routine TuWas im Kontext des Hauptthreads ausfegührt wird. Was bedeutet, dass dein Thread so lange wartet bis die Routine fertig ist. Desweiteren könnte ich mir vorstellen, dass dein Hauptfenster trotz des Threads nicht mehr reagiert.

Zitat:
Dein Turturial hatte ich auch mal vor einiger Zeit durchgelesen und fand es sehr informativ, aber eine Delphi-Umsetzung dafür war glaube ich nicht dabei.
Wie so? da sind doch Demos dabei: http://tutorials.luckie-online.de
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Thorus

Registriert seit: 3. Jul 2004
23 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 16:31
Hmmm, sind die Demos die 7z-dateien? wenn ja, weiß leider nichts damit anzufangen. (hab auch nicht weiter gesucht, wo steht, was das überhaupt ist) edit: ach ups, da is ja ne zip datei bei (wie konnt ich die nur übersehen, guck ich gleich mal rein in die demons)

Das Synchronize ist auch wichtig und genau das soll es auch tun.
Das ausführen des TuEtwas dauert auch nicht sonderlich lange. Normal vielleicht so 1-2 ms. Die Prodzedur soll aber nur alle 10-15 Millisekunden ausgeführt werden. Da ist genug Zeit dazwischen, wo die Schleife unnsinnig durchlaufen wird.

Das Programm funktioniert wunderbar. Mit Priority Lower kann ich sogar ohne Abstriche in WindowsMedia Player Videos nebenbei gucken. Mit Pritority Normal is der Sound dann etwas stockend. Und Higher geht auch ohne große Probleme.

Ich habe damit auch ein fertiges Spiel programmiert, was wunderbar funktioniert. Nur, wenn ich TaskMananger aufmache sehe ich, dass CPU Auslastung 100% ist. Es stört andere Prozesse kaum, ist aber trotzdem irgendwie unsinnig, immer auf 100% laufen zu lassen.

Ich habe davon noch einen anderen Thread, weil ich zwei benötige. Eine Key-Thread, der für die Tastatur da ist und einen, der dann das Spiel berechnet und auswertet.
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 17:18
100% CPU Auslastung ist doch nicht schlimm, wenn keine anderen Prozesse beeinträchtigt sind.

Dein Programm versucht optimal zu laufen und holt sich alle verfügbaren Resourcen, wenn ein anderer Prozess Resourcen braucht, gibt ja dein Programm welche ab.

Deshalb find ich 100%-CPU Auslastung grundsätzlich nicht schlimm, sondern nur wenn andere Prozesse beeinträchtigt werden.

mfg
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Thorus

Registriert seit: 3. Jul 2004
23 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 17:28
Von den Turitalbeispielen konnte ich die Hälfte nicht ausprobieren, weil irgendwelche Komponenten fehlen. Liegt wohl an der DelphiVersion (Delphi5)
Und von dem was ging, war nich das dabei, was ich suchte. War glaub immer 100% Auslastung.


100% CPU-Auslastung ist echt nicht schlimm?
Der Prozessor arbeitet doch dann die meiste Zeit unnötig und verbraucht bestimmt mehr Strom und wird auch bestimmt nicht sonderlich geschont, wenn er dauernd im Dauerbetrieb ist, oder?

Ich habe mal bei anderen kleinen Spielen oder ähnliches geguckt und die laufen nicht immer mit 100% und haben trotzdem ganz gute Grafik. Und auch zB der WindowsMedia Player läuft bei mir nur mit ca 10% Auslastung bei Videos und da wird sicherlich noch einige viel genauer Zeitgeber benötigt, als es bei mir der Fall ist.

Irgendwas gibt es doch bestimmt, um das zu vermeiden, nur weiß ich nicht wie.
So was wie die Sleep-Funktion würde ja funktionieren, nur ist es leider etwas zu langsam und hat eventuell sonst noch n Haken.
  Mit Zitat antworten Zitat
Michael_Bayer

Registriert seit: 20. Mär 2005
137 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 17:45
Doofe Frage, aber was ist es denn, was nur alle 10-15 ms ausgeführt werden darf und wird?
  Mit Zitat antworten Zitat
Thorus

Registriert seit: 3. Jul 2004
23 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung

  Alt 30. Mär 2005, 18:04
Wie ich erst schrieb. Tastaturabgfrage, was gedrückt wurde zB.
Dann ein Thread zum Berechnen des Spieles, was ich halt nur alle 15-20 ms brauchen und dann auch noch das zeichnen des Bildes, wo 50 FPS völlig ausreichen. Mehr wäre unnötig und belastet den Prozessor nur unnötig.

Noch vergessen zu sagen, das Synchronize ist auch sehr wichtig, damit die TuEtwas-Prozedur nicht parallel mehrmals ausgeführt wird. Wenn der PC sehr langsam ist, bekommt man dadurch auch nur weniger FPS hin, was auch beabsichtig ist. Nur mehr als 50-75 FPS benötige ich wie gesagt nicht und wenn es öfter berechnet wird, ist das zwar nicht falsch, aber sinnlos.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz