WaitWindowEvent
- Elektrolurch
- Beiträge: 168
- Registriert: 11.10.2007 16:48
- Wohnort: 49°26'51.46"N - 8°59'49.06"E
- Kontaktdaten:
WaitWindowEvent
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
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
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:
WaitWindowEvent()?
Grüße ... Kiffi
WaitWindowEvent() zu verwenden. Es gibt Ausnahmen, aber von denen
gehe ich jetzt mal nicht aus
Was mich ein wenig stutzig macht:
soll heißen: Wenn die App nicht im Systray ist, dann verwendest Du keinElektrolurch hat geschrieben:[...] und per WaitWindowEvent geparkt.
WaitWindowEvent()?
Grüße ... Kiffi
a²+b²=mc²
-
- Beiträge: 237
- Registriert: 17.10.2008 18:24
- Kontaktdaten:
Re: WaitWindowEvent
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:soll heißen: Wenn die App nicht im Systray ist, dann verwendest Du keinElektrolurch hat geschrieben:[...] und per WaitWindowEvent geparkt.
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.
- Elektrolurch
- Beiträge: 168
- Registriert: 11.10.2007 16:48
- Wohnort: 49°26'51.46"N - 8°59'49.06"E
- Kontaktdaten:
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
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
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
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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".
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.
Der Weise weiß, dass er ein Narr ist.
Wenn dein Fenster versteckt ist, kommt da so oder so kein anderesElektrolurch hat geschrieben: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.Code: Alles auswählen
If X = 9 WaitWindowsEvent() endf
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
- Elektrolurch
- Beiträge: 168
- Registriert: 11.10.2007 16:48
- Wohnort: 49°26'51.46"N - 8°59'49.06"E
- Kontaktdaten:
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.
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
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
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
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
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.
Der Weise weiß, dass er ein Narr ist.
- Elektrolurch
- Beiträge: 168
- Registriert: 11.10.2007 16:48
- Wohnort: 49°26'51.46"N - 8°59'49.06"E
- Kontaktdaten: