![]() |
(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:
Das funktioniert hervorragend, hat aber einen entscheidenden Nachteil: es lastet die CPU zu 100% aus.
__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"); } 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 |
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. |
Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
Zitat:
Zitat:
Zitat:
Zitat:
|
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:
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.
repeat
if IsKeyEvent then HandleKeyEvent; else if IsMouseEvent then HandleMouseEvent; else if IsMessage then HandleMessage; else Idle; until false; |
Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
ok, überzeugt ;)
Danke! |
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 |
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. |
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
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! |
Re: (C) Schleife mit HighPerformanceCounter: 100% CPU-Auslas
Zitat:
wenn ich andere programme auf 100% rennen lasse, wird mein lüfter schneller. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz