Fensterinhalt wird nur bei Mausbewegung aktualisiert

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:   

Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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
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
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag von Kiffi »

Versieh Dein WaitWindowEvent() mit einem Timeout und schon klappts.

Grüße ... Kiffi
a²+b²=mc²
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: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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?
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
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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
Zuletzt geändert von Kiffi am 29.11.2009 16:16, insgesamt 1-mal geändert.
a²+b²=mc²
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: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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?
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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: Fensterinhalt wird nur bei Mausbewegung aktualisiert

Beitrag 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?
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