Seite 1 von 4

Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 15:52
von Mok
Hallo ;)
Ich bin grade dabei ein neues, kleines Prog zu schreiben, das Infos über den RAM ausgibt. Dabei werden alle Angaben nach genau einer Sekunde aktualisiert.
Das Problem: Es wird nur aktualisiert, wenn die Maus im Fenster ist, und man sie bewegt. Zusätzlich (ein Problem kommt ja selten allein) wird das dann nicht jede Sekunde aktualisiert, sondern immer wenn man die Maus bewegt also auch z. B. nach 2 Sekunden oder nach 0,2 Sekunden.

Hier der vollständige Source: (soll ja nachher sowieso OpenSource werden)

Code: Alles auswählen

Global MemoryAll.l
Global MemoryUse.l
Global MemoryPercUse.l
Global MemoryFree.l

Procedure RefreshMem()
  memex.MEMORYSTATUSEX
  memex\dwLength = SizeOf(MEMORYSTATUSEX)
  GlobalMemoryStatusEx_(@memex)
  
  MemoryAll = memex\ullTotalPhys/1024/1024
  MemoryUse = (memex\ullTotalPhys-memex\ullAvailPhys)/1024/1024
  MemoryPercUse = memex\dwMemoryLoad
  MemoryFree = memex\ullAvailPhys/1024/1024
EndProcedure

Enumeration
  #MainWindow
EndEnumeration

Enumeration
  #TextGadget_1
  #TextGadget_2
  #TextGadget_3
  #TextGadget_4
  #TextGadget_1a
  #TextGadget_2a
  #TextGadget_3a
  #TextGadget_4a
  #TextGadget_5
  #ButtonGadget_1
  #ButtonGadget_2
EndEnumeration

ExamineDesktops()
Global Width = DesktopWidth(0)
Global Height = DesktopHeight(0)

ElapsedTime = ElapsedMilliseconds()
RefreshMem()

OpenWindow(#MainWindow,Width-205,Height-204,199-5,149-5,"RAM.inf",#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
GadY = 10
TextGadget(#TextGadget_1,5,GadY,85,20,"RAM gesamt:",#PB_Text_Right)
TextGadget(#TextGadget_1a,95,GadY,85,20,Str(MemoryAll)+"  MB")
GadY+20
TextGadget(#TextGadget_2,5,GadY,85,20,"RAM-Verbrauch:",#PB_Text_Right)
TextGadget(#TextGadget_2a,95,GadY,85,20,Str(MemoryUse)+"  MB")
GadY+20
TextGadget(#TextGadget_3,5,GadY,85,20,"% Verbrauch:",#PB_Text_Right)
TextGadget(#TextGadget_3a,95,GadY,85,20,Str(MemoryPercUse)+"  %")
GadY+20
TextGadget(#TextGadget_4,5,GadY,85,20,"RAM frei:",#PB_Text_Right)
TextGadget(#TextGadget_4a,95,GadY,85,20,Str(MemoryFree)+"  MB")
GadY+20
ButtonGadget(#ButtonGadget_1,5,GadY,70,30,"Optionen")
ButtonGadget(#ButtonGadget_2,GadY+30,GadY,70,30,"Beenden")
GadY+35
TextGadget(#TextGadget_5,5,GadY,Height-204,20,"F1 für Hilfe            by LoRD Soft (Mok)")

Repeat
  If ElapsedTime > 1000
    RefreshMem()
    SetGadgetText(#TextGadget_1a,Str(MemoryAll)+"  MB")
    SetGadgetText(#TextGadget_2a,Str(MemoryUse)+"  MB")
    SetGadgetText(#TextGadget_3a,Str(MemoryPercUse)+"  %")
    SetGadgetText(#TextGadget_4a,Str(MemoryFree)+"  MB")
    ElapsedTime = ElapsedMilliseconds()
  EndIf
Until WaitWindowEvent() = #PB_Event_CloseWindow
Der Beenden-Button funzt noch nicht, das Programm muss also über den Totenkopf in PB gekillt werden.

Grüße, Mok

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 15:58
von Kiffi
Versieh Dein WaitWindowEvent() mit einem Timeout und schon klappts.

Grüße ... Kiffi

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 16:02
von Mok
Kiffi hat geschrieben:Versieh Dein WaitWindowEvent() mit einem Timeout und schon klappts.

Grüße ... Kiffi
Jetzt funzt es zwar, aber es wird auch nicht jede Sekunde aktualisiert, sondern viel schneller, und außerdem flackern die Gadgets so... kann man das nicht ändern?

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 16:07
von Christian+

Code: Alles auswählen

Repeat
  If ElapsedMilliseconds()>ElapsedTime+1000
    RefreshMem()
    SetGadgetText(#TextGadget_1a,Str(MemoryAll)+"  MB")
    SetGadgetText(#TextGadget_2a,Str(MemoryUse)+"  MB")
    SetGadgetText(#TextGadget_3a,Str(MemoryPercUse)+"  %")
    SetGadgetText(#TextGadget_4a,Str(MemoryFree)+"  MB")
    ElapsedTime = ElapsedMilliseconds()
  EndIf
Until WaitWindowEvent(1000) = #PB_Event_CloseWindow
So überprüfst du die Zeit richtig. ElapsedMilliseconds() wird bei jeder Überprüfung benötigt da nur dann du die aktuelle Zeit bekommst.

mfg Christian+

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 16:08
von Kiffi
kann man das nicht ändern?
doch. Du prüfst auf ElapsedTime > 1000. Und das ist immer #True.

Grüße ... Kiffi

// Edit: Am einfachsten geht es mit AddWindowTimer() (seit PB4.4 B1)

Code: Alles auswählen

AddWindowTimer(#MainWindow, #MyTimer, 1000)

Repeat

  WWE = WaitWindowEvent()
  
  Select WWE
      
    Case #PB_Event_Timer
      
      Select EventTimer()
          
        Case #MyTimer
          
          RefreshMem()
          SetGadgetText(#TextGadget_1a,Str(MemoryAll)+"  MB")
          SetGadgetText(#TextGadget_2a,Str(MemoryUse)+"  MB")
          SetGadgetText(#TextGadget_3a,Str(MemoryPercUse)+"  %")
          SetGadgetText(#TextGadget_4a,Str(MemoryFree)+"  MB")
          
      EndSelect
      
  EndSelect
  
Until WWE = #PB_Event_CloseWindow

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 16:16
von Mok
Danke... 2mal ;)

Edit:
Noch ein paar
Wie halte ich mein Fenster stets im Vordergrund? Und wie mache ich, dass es für das Fenster keinen "Eintrag" in der Taskleiste gibt?
Außerdem braucht mein Programm auch etwas CPU-Power und über 1 KB (habs im Task-Manager nachgeschaut), ist das nicht ein bisschen viel für so ein kleines Progrämmchen?

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 17:24
von Kaeru Gaman
bei solchen Event-Geschichten zu beachten:
Set-Befehle lösen (meistens) Events aus, die wollen verarbeitet werden.
Also sollte man sie nur dann ausführen, wenn ein Timeout anliegt, oder eben ein TimerEvent.

Und ElapsedMilliseconds() gibt immer die Millisekunden seit Hochfahren des Rechners zurück, nicht die Millisekunden seit dem letzten Aufruf.

deine ursprüngliche Schleife mal korrigiert (ohne WindowTimer)

Code: Alles auswählen

ElapsedTime = ElapsedMilliseconds()

Repeat
  Event = WaitWindowEvent(100)
  Select Event
    Case #Null    ; kein Event = TimeOut
      If ElapsedMilliseconds() >= ElapsedTime + 1000
        RefreshMem()
        SetGadgetText(#TextGadget_1a,Str(MemoryAll)+"  MB")
        SetGadgetText(#TextGadget_2a,Str(MemoryUse)+"  MB")
        SetGadgetText(#TextGadget_3a,Str(MemoryPercUse)+"  %")
        SetGadgetText(#TextGadget_4a,Str(MemoryFree)+"  MB")
        ElapsedTime = ElapsedMilliseconds()
      EndIf
    Case #PB_Event_CloseWindow
      EXIT = 1
  EndSelect
Until EXIT
aber die "Kunst" mit dem Null-Event wird wohl auch wieder untergehen, wird ja jetzt nicht mehr benötigt, weil man nativ Timer benutzen kann.

siehe Kiffis Beispiel, so sieht das inzwischen korrekt aus.


> Wie halte ich mein Fenster stets im Vordergrund?
guck dir mal StickyWindow() an...

> Außerdem braucht mein Programm auch etwas CPU-Power und über 1 KB
welche version und was ist "etwas"?
Kiffis Version und meine Version sollten bei minimalen CPU% rumdümpeln.

der Speicherbedarf schließt auch die Fenster und -Elemente mit ein.
du kannst eine 10KB exe haben, wenn die ein großes Fenster mit einigen Gadgets aufmacht, braucht dein Task gleich 2MB

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 17:45
von Mok
Kaeru Gaman hat geschrieben: > Außerdem braucht mein Programm auch etwas CPU-Power und über 1 KB
welche version und was ist "etwas"?
Kiffis Version und meine Version sollten bei minimalen CPU% rumdümpeln.
Etwas ist relativ: Meine CPU (2x2,1, AMD Turion) ist z. B. eher schwach, da kommen, wenns schlecht geht schon mal 30 % - 40 % zusammen. Aber ich probier mal eure Version (mein Compiler kackt die ganze Zeit ab... muss erst mal meinen Rechner neu starten)
Kaeru Gaman hat geschrieben: der Speicherbedarf schließt auch die Fenster und -Elemente mit ein.
du kannst eine 10KB exe haben, wenn die ein großes Fenster mit einigen Gadgets aufmacht, braucht dein Task gleich 2MB
Kann es auch sein, dass mein Programm so "viel" RAM braucht, weil es praktisch dauernd darauf zugreift und abfragt?

Grüße, Mok

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 18:05
von Kaeru Gaman
du hast oben geschrieben, dein Programm bräuchte über 1KB...

ein Programm zu schreiben, das unter einem Kilobyte braucht, halte ich für eine echte Herausforderung und mit Fenster unmöglich.


>> Aber ich probier mal eure Version

also meintest du deine Alte version? die hatte ja auch nix wartemäßig drin, kein wunder dass die viel beansprucht hat.

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Verfasst: 29.11.2009 21:35
von Mok
Kaeru Gaman hat geschrieben:also meintest du deine Alte version? die hatte ja auch nix wartemäßig drin, kein wunder dass die viel beansprucht hat.
Sollte das heißen, dass ein bisschen Delay() hier und etwas Delay() da weniger CPU in Anspruch nehmen?