ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4419845
Jetzt (Chat):
21 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
Sourcecode-Probleme
Re: Win32 CPU-Auslastung
Normal
AutorThema
PuMi Online ist nicht jeder!
ZFX'ler


Registriert seit:
02.04.2006

Berlin
266670062
Win32 CPU-AuslastungNach oben.
Hi,

ich steh vor einem Rätsel, um welches ich mich in den letzten Jahren keine Gedanken gemacht habe: CPU-Auslastung bei Win32-Anwendungen.

Ich kann mir in der Win32-Anwendung klar erklären, dass dies mit der while-Schleife des Programmes zusammenhängt, aber die Lösung ist es ja nun auch nicht von einem game mal eben die Hauptschleife zu löschen .

Mir ist da etwas mit Threads spontan eingefallen, aber dies dürfte auch keine Lösung sein. Allerdings frage ich mich nun, wie die Jungs von MS mit ihren CLR und MFC und sonstewas Anwendungen die CPU nicht so derbst auslasten.

Mir geht es deshalb darum, weil es ein wenig nervt, wenn ein Programm "alles" blockiert. Dies gilt auch im minimierten Zustand - und dort ist es noch unmäßiger Sinnvoller als es eigentlich sein sollte. Auch möchte ich doch ein wenig ökonomisch(er) auf Batterie-Laptops sein .

Wenn jemand mal so etwas aus einer MS-Bibliothek oder sonstewo mal implementiert hat, bitte auch kurz Zeigen und in Stichpunkten schreiben, was dort gemacht wird.

Schonmal Danke für Tipps und Lösungen.
02.01.2009, 00:02:07 Uhr
Art Train Developer
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Win32 CPU-AuslastungNach oben.
Ich vermisse da irgendwie die Frage, aber ich denke du möchtest wissen, wie du realisierst, dass dein Programm auch mal leer läuft, wenn es nichts zu tun gibt?

Bei 3D-Anwendungen einfach vertikale Synchronisation ohne Triple-Buffering eingeschaltet lassen. Dann pendelt sich die Framerate bei maximaler GPU-Auslastung ein und die CPU-Auslastung liegt (hoffentlich) darunter. Dann wird immernoch „volle Pulle“ gerendert, aber die Anwendung bewusst zu bremsen macht außer zum Stromsparen ja auch keinen Sinn.

Dass ein Programm bei normaler Priorität alles (oder überhaupt irgendwas) blockiert habe ich in den letzten Jahren nicht erlebt, du kannst Windows aber im Zweifelsfall mit SwitchToThread() signalisieren, dass du gerade nichts eiliges zu erledigen hast.

Und wenn du die Auslastung sonst steuern möchtest, kannst du auch Sleep() benutzen (von welchem zugunsten von SwitchToThread() abgeraten wird).

Um herauszufinden ob Anwendungen minimiert oder verdeckt sind gibt es ja verschiedene Ansätze, das ist von der Anwendung abhängig… und ob das System durch den Akku gespeist wird, lässt sich durch die WinAPI feststellen.

Bei typischen GUI-Anwendungen ist das durch Timer und Nachrichten ein wenig komplexer, da hast du aber auch keine Hauptschleife im eigentlichen Sinne (wegen GetMessage(), das ja wartet, bis Nachrichten ankommen).

Gruß, Ky

Edit@Aramis: Wer ist Edith? Und um die Frage zu beantworten, ich habe mittlerweile einen siebten Sinn für neue Posts… (Nähmaschine auf F5 )
War aber auch knapp, 9 Sekunden Unterschied auf eine halbe Stunde Antwortzeit…

Edit2@Aramis: Okay, man lernt nie aus Habe tatsächlich erst an Edith als Vornamen gedacht

5 Mal gendert, zuletzt am 02.01.2009, 00:48:20 Uhr von Krishty.
02.01.2009, 00:33:57 Uhr
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: Win32 CPU-AuslastungNach oben.
Das Betriebssystem verteilt die zur Verfügung stehende Rechenzeit stets dynamisch auf alle Prozesse. Der Windows Task Scheduler verwendet einen Interrupt der alle 10-15ms den laufenden Thread unterbricht und den Switch zum nächsten Thread vollzieht. Das WinAPI Sleep() unterbindet die Ausführung eines Threads für eine bestimmte Anzahl an Millisekunden (0 ms erzwingt einen Kontextswitch). Die Genauigkeit beträgt dabei aber bloß die erwähnten 10-15ms, d.h. ein Sleep() ist höllisch unexakt.

Wenn kein Thread gleicher Priorität grade rechnen will, bedient das System nacheinander Threads niedriger Priorität. Ein Thread hoher Priorität kann - wenn er nie schläft - somit einer großen Anzahl von low-priority GUI-Schleifen mehr oder weniger die gesamte Rechenzeit wegnehmen. Ich nehme an, das ist dein Problem.

Zitat:

Allerdings frage ich mich nun, wie die Jungs von MS mit ihren CLR und MFC und sonstewas Anwendungen die CPU nicht so derbst auslasten.

Weil GUI-Programme in ihrem Hauptthread generell die Eventschleife haben ... und die schläft sowieso den Großteil der Zeit weil schlicht und einfach nix passiert.

Code:
while (::GetMessage(...)) {...}


Meine Erklärung oben ist übrigens nicht absolut exakt, erzielt aber ein ganz gutes Verhältnis zwischen Exaktheit und Platzverbrauch

Gruß,
Alex

PS: Edith ist aufgewacht und fragt wieso mir Krishty eigentlich auch im neuen Jahr stets zuvorkommt ...
PS@Krishty: Edith ist ein Edit, der zwecks Belustigung des Lesers ein kleines 'h' zu viel hat. Dieser intelligente kleine Sprachwitz ist allgemein üblich, ist schnell geschrieben, gibt unvermeidbaren Edits eine gewisse Würze und lenkt von der Unfähigkeit des Verfassers, es gleich beim ersten Mal richtig zu machen, ab.

2 Mal gendert, zuletzt am 02.01.2009, 00:43:09 Uhr von Aramis.
02.01.2009, 00:34:06 Uhr
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel