CPU-Auslastung vermindern - Delay(100) zuviel?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

CPU-Auslastung vermindern - Delay(100) zuviel?

Beitrag von Delle »

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?
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ja. Dafür ist es gedacht. Allerdings würde ich dir ein Delay(1 bis 5)
empfehlen. Der Wert 100 ist, wenn du mich fragst, doch etwas zu
hoch gesteckt.
Bild
Benutzeravatar
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

Beitrag von ts-soft »

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.
Bild
tranquil
Beiträge: 117
Registriert: 22.09.2004 22:07
Kontaktdaten:

Beitrag von tranquil »

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.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

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.
Bild
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Sieht etwa so aus:

Code: Alles auswählen

Repeat 

EventID = WaitWindowEvent()

If EventID=#PB_Event_CloseWindow:End:EndIf

Sleep_(0)

ForEver
Halt noch paar Gadget-Abfragen...
Benutzeravatar
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

Beitrag von ts-soft »

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.
Bild
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

richtig bei WaitWindowEvent wartet das fenster eh bis was passiert ohne die CPU auszulasten.
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)
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()
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
tranquil
Beiträge: 117
Registriert: 22.09.2004 22:07
Kontaktdaten:

Beitrag von tranquil »

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.
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.

Mike
Benutzeravatar
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

Beitrag von NicTheQuick »

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
Antworten