Seite 1 von 2

Problem mit Eventbehandlung

Verfasst: 27.02.2010 22:09
von walter741
Hallo

Sehe vor lauter Bäumen den Wald nicht mehr.
Habe meinen Code gekürzt bis auf das hier:

Code: Alles auswählen


Procedure Open_Window_0()
  If OpenWindow(0, 321, 135, 600, 360, "Muster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      StringGadget(40, 80,300,20,15,"X1")
      StringGadget(41,210,320,20,15,"Y1")
      ButtonGadget(1,40,40,40,40,"Test",#PB_Button_Toggle    )
  EndIf
EndProcedure

Open_Window_0()

Repeat
 EventID =   WindowEvent();

     If GetGadgetState(1) = 1

          SetGadgetColor(40, #PB_Gadget_BackColor, $0000FF)
          SetGadgetColor(41, #PB_Gadget_BackColor, $0000FF)
          
     Else
          SetGadgetColor(40, #PB_Gadget_BackColor, $FFFFFF)
          SetGadgetColor(41, #PB_Gadget_BackColor, $FFFFFF)
     
     EndIf

Delay (3)
Until EventID = #PB_Event_CloseWindow
End
Wenn ich den Code starte, dann erscheint bei mir nur das Gadget 40.
Verschiebe ich das Fenster, erscheinen auch die beiden anderen Gadgets.

Drücke ich den Button, wechselt nur ein StringGadget die Farbe.

Was mach ich jetzt schon wieder falsch?

Verwende PB 4.4 und WinXP

Danke für Eure Hilfe

Walter

Re: Brauche Hilfe

Verfasst: 27.02.2010 22:22
von ts-soft
Titel bitte ergänzen, Hilfe braucht hier fast jeder!

Code: Alles auswählen

Procedure Open_Window_0()
  If OpenWindow(0, 321, 135, 600, 360, "Muster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    StringGadget(40, 80, 300, 20, 15, "X1")
    StringGadget(41, 210, 320, 20, 15, "Y1")
    ButtonGadget(1, 40, 40, 40, 40, "Test", #PB_Button_Toggle    )
  EndIf
EndProcedure

Open_Window_0()

Repeat
  EventID =   WaitWindowEvent();

  If EventID = #PB_Event_Gadget
    If EventGadget() = 1
      If GetGadgetState(1) = 1

        SetGadgetColor(40, #PB_Gadget_BackColor, $0000FF)
        SetGadgetColor(41, #PB_Gadget_BackColor, $0000FF)

      Else
        SetGadgetColor(40, #PB_Gadget_BackColor, $FFFFFF)
        SetGadgetColor(41, #PB_Gadget_BackColor, $FFFFFF)

      EndIf
    EndIf
  EndIf

Until EventID = #PB_Event_CloseWindow
End
Im EventLoop auf Ereignisse reagieren und nicht einfach Gadgetzustände abfragen.

Gruß
Thomas

Re: Brauche Hilfe

Verfasst: 27.02.2010 22:39
von walter741
Hallo

Danke für die schnelle Antwort.

Der Toggle Button simuliert hier im Beispiel nur das Ergebnis der InpOut.dll.
Je nach dem welcher Eingang vom LPT ein/aus ist, sollte die Farbe der Gadgets wechseln.

Somit habe ich keine WindowsEvents.
Ein Ausschnitt des orig. Codes.

Code: Alles auswählen

Repeat
	
LeseEingang1= CallFunctionFast(*inp,$378+1)   
     If LeseEingang1 & 16= 16 
          SetGadgetColor(40, #PB_Gadget_BackColor, $0000FF)
          SetGadgetColor(41, #PB_Gadget_BackColor, $0000FF)
          
     Else
          SetGadgetColor(40, #PB_Gadget_BackColor, $FFFFFF)
          SetGadgetColor(41, #PB_Gadget_BackColor, $FFFFFF)
     
     EndIf

EventID =   WaitWindowEvent();
    Eventbehandlung vieler anderer Gadgets
:
:
:

Der Farbwechsel ist vor der Eventbehandlung damit es permanent Angezeigt wird.

Wie macht man das dann Richtig?

Walter

Re: Brauche Hilfe

Verfasst: 27.02.2010 22:41
von Kaeru Gaman
ts-soft hat geschrieben:Titel bitte ergänzen, Hilfe braucht hier fast jeder!
bitte beachten!
dein erstes Posting hat nen Edit-Button. hau rein.

Re: Brauche Hilfe

Verfasst: 27.02.2010 23:01
von ts-soft
walter741 hat geschrieben: Somit habe ich keine WindowsEvents.
Solange Du ein Fenster hast, haste auch WindowEvents, die behandelt werden müssen. Zwar nicht
unbedingt von Dir, weil den Rest macht Windows für Dich, aber nur wenn ein EventLoop vorhanden ist.
Jedes erstellen, verändern, verschieben und jeder weiterer Pup erzeugt viele viele events.

Gruß
Thomas

Re: Problem mit Eventbehandlung

Verfasst: 27.02.2010 23:15
von NicTheQuick
Am besten verwendest du 'WaitWindowEvent(Timeout)' mit einem Timeout von z.B. 10 ms und überprüfst nur dann deine LPT-Zustände, wenn der Rückgabewert von 'WaitWindowEvent(10)' gleich 0 ist. So werden auf jeden Fall erstmal alle Events behandelt, die anstehen und nur bei einem Leerlauf die Farben geändert. Das Farben setzen erzeugt nämlich auch wieder neue Events.

Re: Problem mit Eventbehandlung

Verfasst: 27.02.2010 23:19
von hjbremer
auch wenn dein Beispiel suboptimal ist :mrgreen:

so fehlt dir für diesen Zweck

Code: Alles auswählen

UpdateWindow_(WindowID(0))
einfach unter die SetGadgetColor() Befehle setzen

du solltest dir überlegen, ob du WindowEvent nicht gegen WaitWindowEvent austauschen kannst. Bei WaitWindowEvent kannst du einen Parameter angeben, so das die Repeat Schleife alle x Millisekunden durchlaufen wird.

Da ich annehme du fragst die LPT Ports ab, schau dir mal den Befehl AddWindowTimer() an. Ich denke damit kannst du dein Problem optimal lösen.

Re: Problem mit Eventbehandlung

Verfasst: 27.02.2010 23:23
von ts-soft
Noch besser, Du erstellst einen Timer und nur bei einem Timerereignis fragste den LPT ab.
So passiert alles im EventLoop und funktioniert dann auch wie es sein sollte.

WaitWindowEvent() ist schonmal Pflicht, wie mein Vorredner andeutet. TimeOut ist eine
Möglichkeit, Timer sind IMHO die bessere Möglichkeit. WindowEvent() und Delay() sind
Plumpaquatsch :mrgreen:

Re: Problem mit Eventbehandlung

Verfasst: 27.02.2010 23:25
von Kaeru Gaman
oh, das alte Queue-Überlauf-Problem?

@walter
Dinge die Events erzeugen dürfen nicht dauernd getan werden.
in deinem ersten Beispiel wirst du IMMER wenn man nur die Maus bewegt Maßnahmen durchführen, die mindestens zwei, vielleicht sogar sechs Events erzeugen.
(eins bis drei Events pro SetGadgetIrgentwas)

diese Events führen dazu, dass der Loop erneut durchgeführt wird, und ne Handvoll neue Events in die Queue gesteckt werden, die wiederum neue Events erzeugen...

also, so geht dat nich.

um die Farbe zu setzen muss es ein EINMALIGES bestimmendes Ereignis geben.

in deinem Fall wirst du dein CallFunctionFast(*inp,$378+1) doch wohl kaum bei jeder Mausbewegung auslösen wollen.
also, stecke das in eine Bedingung, die wirklich nur dann #True ist, wenn es wirklich sein muss.
... und selbst wenn die turnusmäßig abgefragt werden soll, dann führe das Farbsetzen nur dann aus, wenn es nötig ist.
dafür nimm am besten ein extra Flag.

also, sowas in der Richtung:

Code: Alles auswählen

If Event = LeseMeinenEingangButtonIsPressed Or MeinTimeoutIstAbgelaufen
  LeseEingang1= CallFunctionFast(*inp,$378+1)   
  If LeseEingang1 & 16= 16
    If Farbgebung = 0
      Farbgebung = 1
      SetGadgetColor(40, #PB_Gadget_BackColor, $0000FF)
      SetGadgetColor(41, #PB_Gadget_BackColor, $0000FF)
    EndIf
  Else
    If Farbgebung = 1
      Farbgebung = 0
      SetGadgetColor(40, #PB_Gadget_BackColor, $FFFFFF)
      SetGadgetColor(41, #PB_Gadget_BackColor, $FFFFFF)
    EndIf
  EndIf
EndIf

Re: Problem mit Eventbehandlung

Verfasst: 27.02.2010 23:29
von walter741
Super
Danke

Werd gleich beides testen.

Ergebnis folgt bald.

Nochmals Danke

Walter