Aktuelle Zeit: 30.05.2020 23:45

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 30.12.2019 15:27 
Offline

Registriert: 15.12.2019 16:59
Hallo zusammen,

ich frage mich als Anfänger, welche Methode für die Ereignisabfrage die geeigente ist.

Dazu mal zwei einfache Beispiele. Listing 1 mit der "klassischen" Eventschleife und Listing 2 mit BindEvent und Callbacks.

Code:
; Listing 1
; Ereignisabfrage in Schleife mit Select und ggf. IF

EnableExplicit

Declare OpenMyWindow()
Declare ProgramEnd()
Declare ButtonAction()

Enumeration
  #Window_0
  #Button_0
EndEnumeration

Define Event.i

Procedure OpenMyWindow()
  OpenWindow(#Window_0, #PB_Ignore, #PB_Ignore, 350, 140, "My Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(#Button_0, 110, 90, 110, 30, "Dürck mich!")
EndProcedure

Procedure ProgramEnd() 
  End
EndProcedure

Procedure ButtonAction()
  MessageRequester("Info", "Du hast mich gedrückt!", #PB_MessageRequester_Info)
EndProcedure

OpenMyWindow()

Repeat
  Event = WaitWindowEvent()
  Select Event 
    Case #PB_Event_CloseWindow
      If EventWindow() = #Window_0 ; falls mehrere Fenster möglich sind
        ProgramEnd()
      EndIf
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Button_0
          ButtonAction()
      EndSelect
  EndSelect 
ForEver


Code:
; Listing 2
; Ereignis mit Callback


EnableExplicit

Declare OpenMyWindow()
Declare ProgramEnd()
Declare ButtonAction()

Enumeration
  #Window_0
  #Button_0
EndEnumeration

Define Event.i

Procedure OpenMyWindow()
  OpenWindow(#Window_0, #PB_Ignore, #PB_Ignore, 350, 140, "My Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(#Button_0, 110, 90, 110, 30, "Dürck mich!")
  BindEvent(#PB_Event_CloseWindow, @ProgramEnd(), #Window_0)
  ;BindGadgetEvent(#Button_0, @ButtonAction(), #PB_EventType_LeftClick)
  BindEvent(#PB_Event_Gadget, @ButtonAction(), #Window_0, #Button_0, #PB_EventType_LeftClick)
EndProcedure

Procedure ProgramEnd() 
  End
EndProcedure

Procedure ButtonAction()
  MessageRequester("Info", "Du hast mich gedrückt!", #PB_MessageRequester_Info)
EndProcedure

OpenMyWindow()

Repeat
  WaitWindowEvent()
ForEver



Mir persönlich gefällt die Methode aus Listing 2 wesentlich besser, da auch bei vielen komplexen Fenstern, keine Monster-Eventschleife entsteht (ggf. noch mit einem Mix aus Select/if-Anweisungen). Ich bin mir aber nicht sicher, ob die Methode in Listing 2 nicht auch Nachteile mit sich bringt. Bei Echtzeitereignissen soll man wohl grundsätzlich BindEvent verwenden.

Konkret geht es mir aber nicht darum, wem welche Methode besser gefällt, sondern einfach darum, ob ich BindEvent "bedenkenlos" einsetzen kann oder ich mir damit später einen Haufen Ärger einhandel.

Ich wollte nicht noch einmal eine bereits geführte Diskussion auslösen (siehe viewtopic.php?f=16&t=30130&hilit=bindevent)

Gruß
Istvan42

_________________
--
Mac OS Catalina, PureBasic 5.71 LTS (MacOS X - x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 30.12.2019 15:36 
Offline
Benutzeravatar

Registriert: 10.09.2004 09:59
Istvan42 hat geschrieben:
Ich wollte nicht noch einmal eine bereits geführte Diskussion auslösen (siehe viewtopic.php?f=16&t=30130&hilit=bindevent)


Sondern?
Eigentlich steht doch dort schon alles Wissenswertes!

Was für einen "Ärger" sollte man sich damit denn einhandeln?

_________________
Link tot?
Ändere h3x0r.ath.cx in hex0rs.coderbu.de und alles wird gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 30.12.2019 15:44 
Offline

Registriert: 15.12.2019 16:59
Zitat:
Was für einen "Ärger" sollte man sich damit denn einhandeln?


Genau das ist ja die Frage. Wenn es keine Nachteile hat, dann bin ich ja zufrieden ;-)

_________________
--
Mac OS Catalina, PureBasic 5.71 LTS (MacOS X - x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 30.12.2019 15:55 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Für größere Projekte würde ich BindEvent auf jeden Fall empfehlen. Das hilft auch die Events für die einzelnen Fenster an der Stelle zu kapseln, wo man sie auch erzeugt. So kann man jedem Dialog und jedem Unterfenster eine Include geben, in der sich um alle Dinge für genau dieses Fenster gekümmert werden kann.

Die klassische Eventschleife nutze ich nur noch, wenn ich mir ein kleines Testprogramm zusammenbastel und ich bei vielen Events auf viele Daten zugreifen muss. Dann spare ich mir globale oder shared Variablen, oder Strukturen mit eben diesen Daten und SetWindowData() und Co.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 30.12.2019 19:42 
Online
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Verwende auch viel BindEvent. Sogar auch in Verbindung mit VirtualTables

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 04.01.2020 14:38 
Offline

Registriert: 29.10.2011 16:54
Hallo,

ich persönlich hatte bevor es BINDEVENT gab eine Liste erstellt, in welcher alle Events eingetragen wurden mit Ansprungadresse auf die entsprechende Procedure - ähnlich wie BindEvent jetzt.

Der Vorteil Events wurden immer nur ausgelöst, wenn ich die Eventbearbeitung auch wollte.

Nachteil von BindEvent ist in meinen Augen, das immer sofort ausgeführt werden, egal was das Programm gerade macht.

Dies hatte bei mir zufolge, das innerhalb eines Drawings Blocks aufgrund eines Events ein zweiter Drawing Block gestartet wurde, was entsprechende Fehler nach sich zog. Dann mußte ich den 2. Block immer in einem getrennten Thread auslagern.

Langer Rede kurzer sinn. Im Regelfall funktioniert BindEvent sehr gut, leider muß mann aber auch aufpassen, welche Operationen innerhalb der Eventverarbeitung ausgeführt werden.


Gruß


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Klassische Eventschleife oder BindEvent/Callbacks?
BeitragVerfasst: 04.01.2020 15:43 
Online
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Das ist nicht ganz richtig...

Die mit BindEvent verbundenen Prozeduren werden erst mit dem Aufruf von WaitWindowEvent() nacheinander im Hauptprogramm verarbeitet.
Somit liegt die Verarbeitung der Prozeduren im Hauptprogramm.

Update
Die Reihenfolge ist etwas ungewöhnlich wenn man zum gleichen Objekt mehrere Prozeduren zuweist.
Kann man aber mit leben, wenn man es weiss.

Das zuletzt eingetragene BindEvent wird als erstes verarbeitet.
Code:
;-TOP

Procedure DoEventButton()
  Debug "Begin 1: Bind Event Button..."
  Delay(500) ; Nur zum testen, nicht zu empflegen da diese das Event-Managment blockiert
  Debug "End 1: Bind Event Button..."
EndProcedure

Procedure DoEventButton2()
  Debug "Begin 2: Bind Event Button..."
  Delay(500) ; Nur zum testen, nicht zu empflegen da diese das Event-Managment blockiert
  Debug "End 2: Bind Event Button..."
EndProcedure

Procedure Main()
  If OpenWindow(0, 100, 100, 300, 200, "Test Event", #PB_Window_SystemMenu)
    ButtonGadget(0, 10, 10, 120, 30, "Do event")
   
    BindGadgetEvent(0, @DoEventButton())
    BindGadgetEvent(0, @DoEventButton2())
   
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 0
              Debug "Main Event Button..."
          EndSelect
         
      EndSelect
     
    ForEver
  EndIf
EndProcedure : Main()


P.S.
Somit kann man in der Event Prozedur auch den aktuellen Status vom Event abfragen.
EventWindow, EventGadget, EventType, etc
Code:
;-TOP

Procedure DoEventString()
  Protected r1.s = " - "
  Debug "Bind Event String..."
  Select EventType()
    Case #PB_EventType_Focus : r1 + "#PB_EventType_Focus"
    Case #PB_EventType_LostFocus : r1 + "#PB_EventType_LostFocus"
    Case #PB_EventType_Change : r1 + "#PB_EventType_Change"
     
  EndSelect
  Debug r1
EndProcedure

Procedure Main()
  If OpenWindow(0, 100, 100, 300, 200, "Test Event", #PB_Window_SystemMenu)
    StringGadget(0, 10, 10, 280, 30, "")
   
    BindGadgetEvent(0, @DoEventString())
   
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 0
              ;
          EndSelect
         
      EndSelect
     
    ForEver
  EndIf
EndProcedure : Main()

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye