Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Threads: optimale Nutzen/Prozessorleistung-Optimierung (https://www.delphipraxis.net/43190-threads-optimale-nutzen-prozessorleistung-optimierung.html)

Thorus 30. Mär 2005 13:29


Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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.

Luckie 30. Mär 2005 13:35

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
Zitat:

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.

Thorus 30. Mär 2005 14:03

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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.

jfheins 30. Mär 2005 14:48

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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.

Luckie 30. Mär 2005 14:50

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
Zitat:

Zitat von Thorus
Ich verstehe leider nicht, wieso das falsch ist, bzw wie ich es anders machen sollte.

Na das:
Delphi-Quellcode:
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

Thorus 30. Mär 2005 15:31

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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.

Tyrael Y. 30. Mär 2005 16:18

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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

Thorus 30. Mär 2005 16:28

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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.

Michael_Bayer 30. Mär 2005 16:45

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
Doofe Frage, aber was ist es denn, was nur alle 10-15 ms ausgeführt werden darf und wird?

Thorus 30. Mär 2005 17:04

Re: Threads: optimale Nutzen/Prozessorleistung-Optimierung
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
Seite 1 von 3  1 23      

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