WaitWindowEvent

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

WaitWindowEvent

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

Re: WaitWindowEvent

Beitrag 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
a²+b²=mc²
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Re: WaitWindowEvent

Beitrag 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.
Bild + Bild

Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

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

Beitrag 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".
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

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

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

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