TEvent - Was stelle ich damit an?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

DaysShadow

Betreff: TEvent - Was stelle ich damit an?

BeitragMi, Jan 26, 2011 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Wie der Titel schon verrät würde ich gerne wissen, was ich mit Events anstellen kann bzw. ob die überhaupt zu empfehlen sind und wie man sie einsetzt.
Ich habe mir zwar gestern das ganze angeschaut und was kleines geschrieben, aber da ich den Nutzen nicht ganz sehe weiß ich nicht genau ob ich es denn überhaupt richtig nutze oder nutzen würde.

Im Prinzip habe ich einfach nur auf Tastendruck PostEvent mit einer entsprechenden ID genutzt und dann mit While( PollEvent( ) ) alle vorhandenen Events bearbeitet und den IDs entsprechend behandelt.

Da mir das so aber als nicht sinnvoll erscheint, frage ich hier mal nach.

MfG
Blessed is the mind too small for doubt

Firstdeathmaker

BeitragMi, Jan 26, 2011 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe mal ne GUI geschrieben, welche TEvents benutzt. Das ganze hat so funktioniert, das wenn ein Button gedrückt wurde, dieser auch ein TEvent emittiert hat, und man darüber eine Art messaging System hat.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

undefined

BeitragMi, Jan 26, 2011 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute, der Grundgedanke für dieses System ist es, eine Kommunikation zwischen ansonsten unabhängigen Modulen herzustellen. Vielleicht mag das an mancher Stelle sogar sinnvoll sein, aber ansich habe ich bisher immer bessere, einfachere Wege finden können, um diese Aufgabe zu lösen. Meine persönliche Meinung zu TEvent und Zubehör ist: sperrig, unbequem, umständlich. Und ich sehe keinen Grund dafür, warum man in einem Projekt auf dieses System zurückgreifen sollte, wenn man auch wesendlich schnellere, übersichtlichere, elegantere, direktere Lösungen wählen kann.

Ich habe mich vor längerer Zeit mal recht ausführlich mit dem ganzen Murks beschäftigt, um die MaxGUI in ein für mich erträgliches Format zu pressen. Ich habe auch schon diverse GUI-Module geschrieben und ich würde dafür niemals TEvent verwenden. An die verschiedenen Gadget-Actions werden einfach Funktionspointer rangehängt und fertig. Diese Lösung ist effizient, überschaubar und unkompliziert zu handhaben. Ein Eventsystem hingegen ist immer mit sehr viel mühsamer Schreibarbeit verbunden und läuft über unnötig viele Umwegen.

Ich weis, dass es einige Leute hier im Forum gibt, die auf TEvent und ähnliche Konstruktionen stehen, doch bisher konnte mir irgendwie noch niemand einen wirklich nachvollziehbaren Vorteil nennen, der dem Aufwand gerecht wird. Aber wer weis ... vielleicht zaubert ja doch noch jemand ein unschlagbares Argument aus dem Hut. Wink

DaysShadow

BeitragMi, Jan 26, 2011 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok danke schonmal.

@ FDM:
Das mit dem Messaging System war mir schon so halb klar, da ich mal irgendwann mit der WinApi zu tun hatte und da auch Messages an Programme gesendet werden können z.B. und das war irgendwie vergleichbar...wie auch immer.
Das Aufwand <-> Nutzen Verhältnis ist mir halt nicht ganz klar.

@ undefinded:
Das mit der GUI trifft es ziemlich genau.
Da ich bisher kein einheitliches GUI Modul geschrieben habe, sondern mir nur immer die einzelnen Teile geschrieben habe die ich brauchte, wollte ich das jetzt mal tätigen.
Bevor ich jedoch anfange und dann stellt sich später heraus, das wäre aber so und so viel einfacher und eleganter gegangen und ich bei der MaxGUI halt die Nutzung dieser Events gesehen hatte, dachte ich mir ich frage halt mal nach.
Die Funktionen der einzelnen Teile hatte ich bisher auch über Funktionspointer gelöst, funktionierte soweit auch.
Danke jedenfalls schonmal, lag ich ja bisher nicht ganz so "falsch" bei meiner Gestaltung^^

Vielleicht hat ja noch jemand ein (paar) Argument(e) für oder gegen die Nutzung von Events.

Edit: Die GUI wird eine Ingame-GUI also nicht so wie MaxGUI, falls das irgendeinen Unterschied machen sollte bei der Beurteilung für oder gegen Events.
Blessed is the mind too small for doubt

Rone

Betreff: bla

BeitragMi, Jan 26, 2011 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei einer kleinen InGame Gui will man in der Regel synchron auf seine Events reagieren, von daher sind 'echte' Events und eine Event Queue oftmals zu viel des guten...

Will man allerdings eine universell einsetzbare Gui, sollte man schon ein vernümptiges Eventsystem haben, um zB auch asynchrone Events vernümpftig handhaben zu können, beispielsweise wenn man mit externen Geräten arbeitet...

http://en.wikipedia.org/wiki/Event_%28computing%29

Bisschen psoudocode, merk aber gerade das ich irgw. die EventQueue und TEvent verpeilt habe... Surprised
Vieleicht auch alles mist, bin hundemüde Wink
was solls:


Code: [AUSKLAPPEN]
'#######################################################################
' App.bmx
Type Dialog

   Field myButton:Button
   Field camControl:CamaraControl
   
   Method New()
      myButton = New Button()
      myButton.Clicked = New ButtonClickedEvent.Create(Self,"myButton_clicked")
      myButton.MouseMove = New MouseMoveEvent .Create(Self,"myButton_mouseMove")
      
      camControl = New CamaraControl()
      camControl.ImageAvailable = New ImageAvailableEvent.Create(Self,camControl_ImageAvailable )
   EndMethod

   Method myButton_clicked(sender:Object, e:ButtonClickedEventArgs )
      Notify "Hello"
   EndMethod
   
   Method myButton_mouseMove(sender:Object, e:MouseEventArgs )
      Notify "Hello"
   EndMethod
   
   ' wird asynchron aufgerufen
   Method camControl_ImageAvailable(sender:Object, e:ImageAvailableEventArgs )
               showBuffer(e.Buffer)
   EndMethod


EndType



Code: [AUSKLAPPEN]

'#######################################################################
' Gui.bmx

Type EventArgs
EndType

Type EventHadler

   Field _method:TMethod
   
   Method Create(context:Object, handler:String)
           _method = ...
      Assert CheckSignatur()
   EndMethod
   
   Method CheckSignatur:Int(m::TMethod)
      ' return checkSignaturWithReflection is ok
   EndMethod
   
   Method Invoke(sender:Object, args:EventArgs )
      _method.Invoke(sender, args )
   EndMethod
   
EndType

'######################################################################
' CameraControl.bmx
' Asynchrones event


Type ImageAvailableEventtArgs Extends EventArgs
   Field buffer:TPixmap
   Method Create:ImageAvailableEventventArgs (_buffer:TPixmap)
      buffer =_buffer
   EndMethod
EndType

Type ImageAvailableEventExtends EventHadler
   Field sender:Object
   Field args:ImageAvailableEventtArgs
EndType

Type CamaraControl

   Field ImageAvailable:ImageAvailableEvent
   
   Method GrabImageFromCamera()
      'StartImageGrabThread() in grab-thread ausführen
   EndMethod
   
   Method StartImageGrabThread()
      ' Grab image
      ' Fire ImageAvailableEvent
   EndMethod
   
EndType

'#######################################################################
' Button.bmx
' Button nutzt synchrone events

Type MouseEventArgs Extends EventArgs
   Field X:Int
   Field Y:Int
   Method Create:MouseEventArgs(_x:Int,_y:Int)
   EndMethod
EndType

Type ButtonClickedEvent Extends EventHadler
   Field sender:Object
   Field args:EventArgs
EndType

Type MouseMoveEvent Extends EventHadler
   Field sender:Object
   Field args:MouseEventArgs
EndType

Type Button

   Field Clicked:ButtonClickedEvent
   Field MouseMove:MouseMoveEvent
   
   Method InternalUpdate()
      ' if button was clicked
      If Clicked Then
         Clicked.Invoke(Self, New ButtonClickedEvent )
      EndIf
      If MouseMove Then
         MouseMove.Invoke(Self, New
      EndIf
   EndMethod
   
EndType

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group