Seite 1 von 1

Gelöst * #PB_Event_Repaint => Dauerschleife?

Verfasst: 09.09.2010 16:14
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.

Re: #PB_Event_Repaint => Dauerschleife?

Verfasst: 09.09.2010 16:29
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 

Re: #PB_Event_Repaint => Dauerschleife?

Verfasst: 09.09.2010 21:43
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

Re: #PB_Event_Repaint => Dauerschleife?

Verfasst: 09.09.2010 21:52
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 

Re: #PB_Event_Repaint => Dauerschleife?

Verfasst: 10.09.2010 16:47
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.