Gelöst * #PB_Event_Repaint => Dauerschleife?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Gelöst * #PB_Event_Repaint => Dauerschleife?

Beitrag von Mok »

Hallo.
Ich möchte die CPU-Auslastung grafisch anzeigen. Mit Hilfe von COMatePlus lese ich also die prozentuale Auslastung aus, welche ich dann in ein Sprite zeichne und wieder aktualisiere. Allerdings kann ich keine Events mehr abfragen.

Code: Alles auswählen

IncludePath #PB_Compiler_Home + "srod\comateplus\"
XIncludeFile "comateplus.pbi"

Procedure GetLoad()
Define objWMIService.COMateObject
Define objItem.COMateObject

Define colItems.COMateEnumObject
Define Computer.s = "."

objWMIService = COMate_GetObject("winmgmts:\\" + Computer + "\root\cimv2", "")
If objWMIService
  colItems  = objWMIService\CreateEnumeration("ExecQuery('SELECT * FROM Win32_Processor')")
  If colItems
    objItem = colItems\GetNextObject()
    ProcedureReturn objItem\GetIntegerProperty("LoadPercentage")
  EndIf
EndIf
EndProcedure
    
OpenWindow(0,320,320,200,200,"Diagramm")
CreateImage(0,50,130,32)
ImageGadget(0,20,20,50,130,ImageID(0))
ListViewGadget(1,90,20,80,130)
ButtonGadget(2,20,160,100,30,"Clear")

StartDrawing(ImageOutput(0))
 Repeat
   
  Event = WaitWindowEvent()
    
  Select Event
  
    Case #PB_Event_Gadget
      If EventGadget() = 2
        ClearGadgetItems(1)
      EndIf
    
    Case #PB_Event_Repaint
      FillArea(10,110-Load,#Black,#Black)
      Load = GetLoad()
      Box(10,10,30,100,RGB(0,128,0))
      Box(10,110-Load,30,Load,RGB(10,255,5))
      DrawText(10,110,Str(Load)+" %   ",RGB(10,255,5),RGB(0,0,0))

      SetGadgetState(0,ImageID(0))
      AddGadgetItem(1,-1,Str(Load)+" %")
  EndSelect

Until Event = #PB_Event_CloseWindow
StopDrawing()
End
Wie kann ich einen Klick auf "Clear" registrieren lassen?


Gruß, Mok.
Zuletzt geändert von Mok am 10.09.2010 19:40, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: #PB_Event_Repaint => Dauerschleife?

Beitrag von STARGÅTE »

Was hat denn #PB_Event_Repaint dort überhaupt verloren ?

Wenn du eh auf ein Image zeichnest, brauchst du kein "Repaint", denn das Image wird ja nicht wie ein WindowOutput "vernichtet"

Außerdem würde jedes änder von gadgets selbst ein Event erzeugen daher "die Endlosschleife"

Immer erst alle Events abarbeiten und dann erst selber Events auslosen:
zB wird so alle 100ms deine Anzeige aktuallisiert:

Code: Alles auswählen

StartDrawing(ImageOutput(0))
Repeat
   
  Repeat
 
    Event = WaitWindowEvent(100)
    
    Select Event
  
      Case #PB_Event_Gadget
        If EventGadget() = 2
          ClearGadgetItems(1)
        EndIf
    
    EndSelect

  Until Not Event
 
  FillArea(10,110-Load,#Black,#Black)
  Load = GetLoad()
  Box(10,10,30,100,RGB(0,128,0))
  Box(10,110-Load,30,Load,RGB(10,255,5))
  DrawText(10,110,Str(Load)+" %   ",RGB(10,255,5),RGB(0,0,0))
  SetGadgetState(0,ImageID(0))
  AddGadgetItem(1,-1,Str(Load)+" %")

Until Event = #PB_Event_CloseWindow
StopDrawing()

End 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: #PB_Event_Repaint => Dauerschleife?

Beitrag von PMV »

Und wenn man mit der Maus über dem Fenster navigiert ... wird es nicht
mehr alle 100ms aktualisiert. So was ist besser mit Timern zu lösen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: #PB_Event_Repaint => Dauerschleife?

Beitrag von STARGÅTE »

Ja richtig PMV, da gibs ja diese "recht neue Funktion", danke.

Hier die Version mit Timer : (ohne Inlcude, hab ich nich -.-)

Code: Alles auswählen

Procedure GetLoad()
  ProcedureReturn Random(100)
EndProcedure
    
OpenWindow(0,320,320,200,200,"Diagramm")
CreateImage(0,50,130,32)
ImageGadget(0,20,20,50,130,ImageID(0))
ListViewGadget(1,90,20,80,130)
ButtonGadget(2,20,160,100,30,"Clear")

AddWindowTimer(0, 0, 100)

StartDrawing(ImageOutput(0))
Repeat
   
  Event = WaitWindowEvent()
    
  Select Event
  
    Case #PB_Event_Gadget
      If EventGadget() = 2
        ClearGadgetItems(1)
      EndIf
    
    Case #PB_Event_Timer
      If EventTimer() = 0
        FillArea(10,110-Load,#Black,#Black)
        Load = GetLoad()
        Box(10,10,30,100,RGB(0,128,0))
        Box(10,110-Load,30,Load,RGB(10,255,5))
        DrawText(10,110,Str(Load)+" %   ",RGB(10,255,5),RGB(0,0,0))
        SetGadgetState(0,ImageID(0))
        AddGadgetItem(1,-1,Str(Load)+" %")
      EndIf
  EndSelect

Until Event = #PB_Event_CloseWindow
StopDrawing()
End 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: #PB_Event_Repaint => Dauerschleife?

Beitrag von Mok »

Wenn ich GetLoad() anpasse, habe ich das selbe Problem wie vorher, also glaube ich, dass es an der Art liegt, mit der die Auslastung abgefragt wird (mit der Random()-Prozedur geht es einwandfrei). Momentan frage ich die Auslastung mit WMI und COMatePlus ab und frage mich wie das der Task-Manager macht, ohne dass dabei Events verloren gehen.

EDIT
OK, dank PBOSL hätte ich das jetzt gelöst.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Antworten