100% Cpu- Auslastung

Anfängerfragen zum Programmieren mit PureBasic.
Olaf de Viesel
Beiträge: 9
Registriert: 31.08.2009 02:04

100% Cpu- Auslastung

Beitrag von Olaf de Viesel »

Hallo Leute!

Wie kann man den Code so umschreiben, das die CPU nicht 100% ausgelastet ist und das nur bei der "WindowEvent()"- Abfrage?

Code: Alles auswählen

Repeat 

    EventID = WindowEvent() 
 
Until EventID = #PB_Event_CloseWindow  Or EventID = #PB_Event_Gadget
Also eine ständige Abfrage anstelle der Schleife??

Vielen Dank im Vorraus
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

gugg mal in die Hilfe unter:

Code: Alles auswählen

Ereignis = WaitWindowEvent([Timeout])
Cheers,
Thalius
"...smoking hash-tables until until you run out of memory." :P
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag von Deluxe0321 »

Auch möglich:

Code: Alles auswählen

Repeat
    EventID = WindowEvent()
    If EventID = 0
       Delay(1)
    Endif
Until EventID = #PB_Event_CloseWindow  Or EventID = #PB_Event_Gadget 
Ich habe keine Lösung, aber ich bewundere das Problem.
Olaf de Viesel
Beiträge: 9
Registriert: 31.08.2009 02:04

Beitrag von Olaf de Viesel »

ahh ich danke euch ^^
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ein Delay(...) darf nie in einer (Wait)WindowEvent schleife verwendet werden!!!
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Und warum nicht?

Du musst es nur so machen wie Deluxe: Delay nur ausführen, wenn Event-Stapel leer. Sonst blockt es die Schleife.
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 »

Delay klaut nur events und hat in einem Eventloop nichts zu suchen.

Nimm WaitWindowEvent und die CPU macht sowieso 99% Pause im
EventLoop, aber ohne Eventschluckende und bedienungshemmende Delays.

Delay ist nur selten nützlich, in einem EventLoop hat es garnichts zu suchen.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das Delay blockt trotzdem, wenn im nächsten Durchlauf ein Event anliegt.
da es mittlerweile ein Timeout fürs WatWindowEvent gibt, sollte man auf Delay in Eventschleifen komplett verzichten.

btw, ein Delay(1) wartet eine komplette TimeSlice, also 13 - 16 ms.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Und wie bekomme ich dann folgendes Konstrukt (gekürzt) aus der Hilfe hin, ohne dass die CPU 100% frisst? Weil WaitWindowEvent() mit Zeitangabe macht Probleme, wenn nebenbei noch ein Timer läuft.

Code: Alles auswählen

Repeat
  Repeat
    ; Always process all the events to flush the queue at every frame
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1
    
      Case #PB_Event_Gadget
        
        ; Do the normal application management here    
    EndSelect
    
  Until Event = 0 ; Quit the event loop only when no more events are available
 
  ; Clear the screen and draw our sprites
  ClearScreen(RGB(0,0,0))
  ClipSprite(0, 0, 0, x, x/8)
  DisplaySprite(0, x, 100)
  DisplaySprite(0, x, x)
  DisplaySprite(0, 300-x, x)
  DisplaySprite(0, playerX, playerY)
    
  FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back

  ;<< hier würd ich mit einem Delay(1) die CPU-Last verringern

Until  Quit Or KeyboardPushed(#PB_Key_Escape)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das ist was ganz anderes...
mit WindowedScreen muss man anders arbeiten als mit nem reinen EventLoop.

schau dir als Anregung mal mein super-billiges GameTiming an.
http://www.purebasic.fr/german/viewtopic.php?t=17400
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten