Problem mit Eventbehandlung

Anfängerfragen zum Programmieren mit PureBasic.
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Problem mit Eventbehandlung

Beitrag 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
Zuletzt geändert von walter741 am 27.02.2010 22:45, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Brauche Hilfe

Beitrag 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
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Re: Brauche Hilfe

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

Re: Brauche Hilfe

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Brauche Hilfe

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Problem mit Eventbehandlung

Beitrag 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.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Problem mit Eventbehandlung

Beitrag 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.
Zuletzt geändert von hjbremer am 27.02.2010 23:23, insgesamt 1-mal geändert.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem mit Eventbehandlung

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

Re: Problem mit Eventbehandlung

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Re: Problem mit Eventbehandlung

Beitrag von walter741 »

Super
Danke

Werd gleich beides testen.

Ergebnis folgt bald.

Nochmals Danke

Walter
Antworten