Seite 1 von 2

WaitWindowEvent

Verfasst: 12.12.2008 13:38
von Elektrolurch
Hi All

Ich habe vor mein Programm wenn es seine Arbeit getan hat nicht komplett zu schließen sondern in der Trace leiste zu parken.
Dazu habe ich das Fenster mit hidewindow geschloßen und per WaitWindowEvent geparkt.
Sowie es aussieht verbrauchte es nun keine Rechnerleistung mehr und kann jederzeit, wenn ich mit der Maus über das Icon fahre wieder belebt werden.
Ist dieser Weg richtig oder gibt es da andere Lösungsansetze.

Bye Andre

Re: WaitWindowEvent

Verfasst: 12.12.2008 13:56
von Kiffi
prinzipiell ist die richtige Vorgehensweise bei Applikationen
WaitWindowEvent() zu verwenden. Es gibt Ausnahmen, aber von denen
gehe ich jetzt mal nicht aus

Was mich ein wenig stutzig macht:
Elektrolurch hat geschrieben:[...] und per WaitWindowEvent geparkt.
soll heißen: Wenn die App nicht im Systray ist, dann verwendest Du kein
WaitWindowEvent()?

Grüße ... Kiffi

Re: WaitWindowEvent

Verfasst: 12.12.2008 15:22
von Dare Devil
Kiffi hat geschrieben:prinzipiell ist die richtige Vorgehensweise bei Applikationen
WaitWindowEvent() zu verwenden. Es gibt Ausnahmen, aber von denen
gehe ich jetzt mal nicht aus

Was mich ein wenig stutzig macht:
Elektrolurch hat geschrieben:[...] und per WaitWindowEvent geparkt.
soll heißen: Wenn die App nicht im Systray ist, dann verwendest Du kein
WaitWindowEvent()?

Grüße ... Kiffi


Bei Operationen, wo das Fenster regelmaessig refresht werden muss (z.B. Zeichenoperationen) muss man wohl WindowEvent() plus einer Delay-Funktion nehmen oder WaitWindowEvent() mit einem Parameter anstelle der Delay-Funktion.

Das haengt jetzt ganz davon ab, was dein Programm macht. In der Regel sollte man aber WaitWindowEvent() wie Kiffi es bereits gesagt hat - bevorzugen.

Wenn dein Programm in den Systray minimiert wurde und es KEINE Operationen auszufuehren hat, sonderrn einfach nur warten soll, bis man es wieder aufruft, dann ist die Vorgehensweise mit WaitWindowEvent() richtig.

Verfasst: 12.12.2008 16:15
von Andesdaf
Eigentlich sollte man bei jedem Fensterprogramm WaitWindowEvent() ver-
wenden, auch wenn es im Systray ist (so mach ich's immer). In diesem Falle
würde ich auch WaitWindowEvent nehmen.

Verfasst: 13.12.2008 15:23
von Elektrolurch
Hi all

Natürlich verwende ich auch WaitWindowEvent.

Mein Gedanke war nur der, da ich als Anfänger gerne noch mit IF abfragen arbeite und diese in einer Repeat - Forever Schleife einsetzte.
Wenn nun an einem Zeitpunkt alle If anfragen (da erfüllt) nicht mehr ausgeführt werden können, die folgende einzufügen

Code: Alles auswählen

If X = 9
WaitWindowsEvent()
endf
Ohne diese würde das Programm ja endlos die anderen Bedingungen abklappern. So schlummert (verbraucht keine Rechnerleistung) mein Programm bis der User auf das Icon kommt.
Da ich aber noch Anfänger bin und sich grauslichen Code produziere wollte ich einfach mal hören ob man dies auch so machen kann, oder ob da noch ein Denkfehler vorhanden ist.

Bye Andre

Verfasst: 13.12.2008 15:38
von Kaeru Gaman
ne, da machst du nen denkfehler.

wenn du in deiner Hauptschleife ein WaitWindowEvent() ohne Timeout drin hast,
dann wartet er an genau der stelle auf das nächste event,
und denkt nich im Traum dran die Abfragen durchzurödeln.

ich weiß nicht, was dein X zur 9 werden läßt, aber wenn das ein Klick auf ein Gadget ist,
dann kannst du pech haben, weil es nahezu unmöglich ist nach dem klick die Maus nicht mehr zu bewegen,
also kommt noch ein MouseMove event hinterhergeschossen und dein WaitWindowEvent ist schon wieder verlassen.

du könntest allerdings in deiner hauptschleife eine general-abfrage einbaun,
die alle anderen abfragen überspringt, wenn das prog in den systray minimiert ist,
und nur auf einen systray-doppelklick reagiert um es wieder aufzupoppen.

aber ohne gesonderte abfrage ist dein WaitWindowEvent kein "parken".

Verfasst: 13.12.2008 15:51
von edel
Elektrolurch hat geschrieben:

Code: Alles auswählen

If X = 9
WaitWindowsEvent()
endf
Ohne diese würde das Programm ja endlos die anderen Bedingungen abklappern. So schlummert (verbraucht keine Rechnerleistung) mein Programm bis der User auf das Icon kommt.
Wenn dein Fenster versteckt ist, kommt da so oder so kein anderes
Event, das Fenster regiert in diesem Fall nur noch auf das Icon. Es
wartet also erst auf eine Eingabe und belastet die CPU so ueberhaupt
nicht. Deswegen ja auch WaitWindowEvent.

Danilo hatte das mal schoen beschrieben was hinter WaitWindowEvent steckt
http://www.purebasic.fr/german/viewtopic.php?t=23

Verfasst: 13.12.2008 18:45
von Elektrolurch
Hi all
Entweder stehe ich auf der Leitung oder ich drücke mich etwas unglücklich aus.
Ich probier es noch einmal. Vor dem folgenden Code verstecke ich das Fenster mit HideWindow, so dass nur noch das Icon in der Traceleiste zu sehen ist.

Code: Alles auswählen

X=0
Repeat
    If X= 0
    Debug "Eine Bedingung"
    X=X+1
    EndIf
    If X= 1
    Debug "Eine Bedingung"
    X=X+1
    EndIf
    If X= 2
    Debug "Eine Bedingung"
    X=X+1
    EndIf
    If X= 3
    Debug "Alle Teile abgearbeitet"
    WaitWindowEvent()
    EndIf
ForEver
Wenn nun das WaitWindowEvent drin ist kommt die Meldung "Alle Teile...." nur einmal und das Programm schläft bis zur Reaktivierung.
Rechnerleistung 0

Lasse ich das WaitWindowEvent weg erhalte ich die Meldung "Alle Teile...."
ständig weiter. Ergo wird so Rechnerleistung verbraten.

Danke für eure Geduld.

Bye Andre

Verfasst: 13.12.2008 18:56
von Kaeru Gaman
du hast nix davon gesagt, dass du mit deiner Repeat/Forever-Schleife nicht die Eventschleife meinst.


du solltest die abarbeitung in eine procedure packen, die einmal aufgerufen wird.
außerdem solltest du die Endbedingung, in diesem fall die x=3, als endbedingung der schleife nehmen.

Code: Alles auswählen

Procedure Abarbeitung()
  X=0
  Repeat
      If X= 0
      Debug "Eine Bedingung"
      Debug x
      X=X+1
      EndIf
      Delay(500)
      If X= 1
      Debug "Eine Bedingung"
      Debug x
      X=X+1
      EndIf
      Delay(500)
      If X= 2
      Debug "Eine Bedingung"
      Debug x
      X=X+1
      EndIf
      Delay(500)
  Until X=3
  Debug "Alle Teile abgearbeitet"
EndProcedure

#Button = 0

OpenWindow(0, #PB_Ignore, 0, 200, 100, "Abarbeitung")
CreateGadgetList(WindowID(0))
  ButtonGadget(#Button, 20, 20, 160, 60, "Abarbeiten" )

Repeat
  EvID = WaitWindowEvent()
  EvGD = EventGadget()
  Select EvID
    Case #PB_Event_Gadget
      Select EvGD
        Case #Button
          Abarbeitung()
      EndSelect
    Case #PB_Event_CloseWindow
      EXIT = 1
  EndSelect
Until EXIT
btw:
so wie es jetzt ist, sowohl dein beispiel als auch meins,
reagiert das programm während der Abarbeitung auf keine Events.
also das sollte man sowieso noch anders lösen,
ggf indem man die abarbeitung in nen thread packt,
außerdem wäre es vielleicht nett, den Fortschritt im Fenster anzuzeigen,
wenn der User das prog während der abarbeitung unHiden will.

Verfasst: 13.12.2008 19:09
von Elektrolurch
Hi Kaeru Gaman

Ok leuchtet mir ein, in einer eigenen Prozedure ist es sicher besser aufgehoben.

Werde es noch heute umstricken.

Danke.

Bye Andre