CPU-Auslastung vermindern - Delay(100) zuviel?
CPU-Auslastung vermindern - Delay(100) zuviel?
Was kann man in einer Repeat/Forever-Schleife als Delay() nehmen, damit das Programm nicht zuviel CPU frisst, gleichzeitig aber nicht "einschläft" und die Events zu lahm handelt?
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Wie oft den kommt diese Frage denn noch, nimm Sleep_(0). Pausiert solange wie nötig, aber wenn keine Pause erforderlich ist auch unter 1 ms. Die Verwaltung der Pausenlänge übernimmt in diesem Fall Windows, ansonsten wie MVXA schon sagte.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Von einem Delay(xxx) halte ich persönlich garnix. Entweder wartet man auf ein Event oder man macht nen pooling. (Das aber nur im absoluten Notfall)
Was ist das für eine Schleife in der Du warten möchtest? Was macht die?
Mike
EDIT: Achja, wenn in der Schleife irgendwelche Berechnungen gemacht werden dann würde ich eher auf das Delay verzichten und die Task-Priorität verringern. Das wollte ich doch noch gesagt haben.
Was ist das für eine Schleife in der Du warten möchtest? Was macht die?
Mike
EDIT: Achja, wenn in der Schleife irgendwelche Berechnungen gemacht werden dann würde ich eher auf das Delay verzichten und die Task-Priorität verringern. Das wollte ich doch noch gesagt haben.
Sieht etwa so aus:
Halt noch paar Gadget-Abfragen...
Code: Alles auswählen
Repeat
EventID = WaitWindowEvent()
If EventID=#PB_Event_CloseWindow:End:EndIf
Sleep_(0)
ForEver
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
In der Schleife kannste das Delay oder Sleep weglassen, ist bei WaitWindowEvent() nicht erforderlich, bzw. mehr falsch als richtig
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

richtig bei WaitWindowEvent wartet das fenster eh bis was passiert ohne die CPU auszulasten.
bei netzwerksachen würde ich folgendes machen:
so wird die CPU nicht viel ausgelastet weil nur jede 1/4 sekunde nach einem serverevent bzw. clientevent geschaut wird und die windowevents laagen auch nicht wegen waitwindowevent()
bei netzwerksachen würde ich folgendes machen:
Code: Alles auswählen
Procedure netzwerkzeugsl()
;hier kommt der code für das netzwerk hin
Delay(250)
EndProcedure
netzwerkthread = CreateThread(netzwerkzeugsl(),"")
Repeat
;Hauptcode mit WaitWindowEvent
Until quit = 1
KillThread(netzwerkthread)
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping

Dafür gibt es die Funktion WSAAsyncSelect _() mit welcher ein WindowsEvent ausgelöst wird ohne mittels eines poolings auf eine message zu warten. Find ich persönlich wesendlich schicker. Mal davon ab das man dann auch 100% Leistung des Programmes bekommt wenn man es braucht und es nicht unnötig mit einem delay oder sleep_() (ist im übrigen das gleiche da delay nur ein wrapper auf sleep ist) das programm ausbremst.MVXA hat geschrieben:Ich halte Delay() schon für sehr wichtig. Vor allem wenn man ein
Programm schreiben möchte das mit Fenster und Netzwerk Events
arbeiten soll.
Mike
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Wie oft soll ich's denn noch schreiben:
Code: Alles auswählen
Repeat
Select WindowEvent()
Case #PB_EventCloseWindow : Break
Case #PB_EventGadget
...
Case 0 : Delay(1)
EndSelect
ForEver