Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslastung (https://www.delphipraxis.net/22524-c-schleife-mit-highperformancecounter-100-cpu-auslastung.html)

Tubos 18. Mai 2004 20:05


(C) Schleife mit HighPerformanceCounter: 100% CPU-Auslastung
 
Hallo;

für eine kleine Textanimation in C (nur Konsole) ist mir GetTickCount und Sleep zu ungenau.

Ich habe mir also folgenden Code gebastelt, der in einer Endlosschleife immer 1 sek wartet und dann ausgibt "Eine Sekunde ist um".
Natürlich ist das nur ein Beispiel, die Funktion werde ich noch so umändern, dass sie mit Millisekunden funktioniert.
Code:
__int64 freq,count,old;
int i=0;
if (QueryPerformanceFrequency(&freq)==0)
{
   printf("Fehler, Hardware unterstuetzt keinen High-Performance-Counter!");
   getch();
   exit(EXIT_FAILURE);
}
   for (;;)
{
   QueryPerformanceCounter(&count);
   old=count;
   while (((count-old)/freq)<1)
   {
      QueryPerformanceCounter(&count);
   }
   printf("Eine Sekunde ist um\n");
}
Das funktioniert hervorragend, hat aber einen entscheidenden Nachteil: es lastet die CPU zu 100% aus.
Wenn ich sleep(1) reinschreibe, wartet er aber 5 ms und die Genauigkeit von 1 ms, die ich haben will, wird nicht erreicht.
Was kann ich tun, damit der Computer nicht total ausgelastet wird in dieser Schleife?

EDIT:
sry, bitte nach "allgemeine fragen zum programmieren" verschieben.
danke

moritz 18. Mai 2004 20:07

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Naja, völlig logisch. Du versorgst ihn die ganze Zeit mit Anweisungen -> 100% Auslastung. Bau trotzdem mal ein sleep(1) ein, das sollte gehen.

Edit: Du könntest es auch in der Nachrichtenschleife abarbeiten.

Tubos 18. Mai 2004 21:22

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Zitat:

Naja, völlig logisch. Du versorgst ihn die ganze Zeit mit Anweisungen -> 100% Auslastung. Bau trotzdem mal ein sleep(1) ein, das sollte gehen.
Zitat:

Wenn ich sleep(1) reinschreibe, wartet er aber 5 ms und die Genauigkeit von 1 ms, die ich haben will, wird nicht erreicht.
Sleep habe ich schon probiert, das geht aber nur auf 5 ms.


Zitat:

Edit: Du könntest es auch in der Nachrichtenschleife abarbeiten.
Zitat:

für eine kleine Textanimation in C (nur Konsole)
Nur Konsole --> keine Nachrichtenschleife.

neolithos 18. Mai 2004 21:36

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Was stört dich das der Prozessor bei 100% läuft, wenn es für die Anwendung angemessen ist.

Nur so kann man auch deine genauigkeit erhalten, die du anstrebst.

Da die ausführung von Sleep oder anderen Prozessor schonenden Funktionen meist mehr als eine ms benötigen.

Und überleg mal wie es zu DOS-Zeiten war.

Delphi-Quellcode:
repeat
  if IsKeyEvent then
     HandleKeyEvent;
  else if IsMouseEvent then
     HandleMouseEvent;
  else if IsMessage then
     HandleMessage;
  else
     Idle;
until false;
So sah damals meine Hauptprogramm-Schleife aus. Die hat auch eine Auslastung von 100% hervorgerufen. Und die Prozessoren laufen Heute noch. Für Spiele gilt übrigens das selbe.

Tubos 18. Mai 2004 21:40

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
ok, überzeugt ;)

Danke!

Muetze1 18. Mai 2004 23:26

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Moin!

Sleep() gibt auch automatisch anderen Prozessen Zeit ab, was dann auch zu der Ungenauigkeit führt.

MfG
Muetze1

Tubos 19. Mai 2004 06:00

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Ja, kann ich mir vorstellen.
Wenn (laut Taskmanager) 240 Threads gleichzeitig laufen, geht es halt nicht dass mein Prog jede Millisekunde drankommt oder nur für 1 ms gestoppt wird.

Schubi 19. Mai 2004 08:30

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Was redet ihr hier über Prozessorauslastung?
Ein Prozessor arbeitet IMMER mit 100% Auslastung. Oder was denkt ihr was der Leerlaufprozess ist?
Das is ne Schleife des Kernels die 100% Prozessorlast verursacht, wenn kein anderes Programm Rechenzeit beansprucht.

Ein Prozessor kann ja schlecht mal kurz ne Pause machen, wenn er nix zu tun hat :mrgreen:

Unter DOS isses also sowieso egal, was dein Programm mit dem Prozessor macht, da gibts ja kein Multitasking. Unter Windows klaust du die Rechenzeit halt den anderen Programmen.

DP-Maintenance 19. Mai 2004 09:24

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Sonstige Fragen zu Delphi" nach "Programmieren allgemein" verschoben.
Für NICHT Delphi Fragen ist die Sparte "Programmieren allgemein" da!

Tubos 19. Mai 2004 09:37

Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
 
Zitat:

Was redet ihr hier über Prozessorauslastung?
Ein Prozessor arbeitet IMMER mit 100% Auslastung. Oder was denkt ihr was der Leerlaufprozess ist?
Das is ne Schleife des Kernels die 100% Prozessorlast verursacht, wenn kein anderes Programm Rechenzeit beansprucht.
klingt logisch, aber warum läuft dann der lüfter ganz langsam wenn der leerlaufprozess ja 100% cpu belegt?
wenn ich andere programme auf 100% rennen lasse, wird mein lüfter schneller.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.
Seite 1 von 2  1 2      

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