Seite 1 von 3
CPU-Auslastung vermindern - Delay(100) zuviel?
Verfasst: 12.09.2005 22:18
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?
Verfasst: 12.09.2005 22:19
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.
Verfasst: 12.09.2005 22:34
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.
Verfasst: 12.09.2005 22:56
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.
Verfasst: 12.09.2005 23:08
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.
Verfasst: 12.09.2005 23:08
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...
Verfasst: 12.09.2005 23:42
von ts-soft
In der Schleife kannste das Delay oder Sleep weglassen, ist bei WaitWindowEvent() nicht erforderlich, bzw. mehr falsch als richtig
Verfasst: 13.09.2005 00:11
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()
Verfasst: 13.09.2005 06:30
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
Verfasst: 13.09.2005 09:54
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