Difference between revisions of "neoGFX Event System"

From neoGFX
Jump to: navigation, search
 
Line 16: Line 16:
 
When 's' is destroyed any associated event registrations are de-registered automatically.  Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.
 
When 's' is destroyed any associated event registrations are de-registered automatically.  Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.
  
The event system is fully multi-threaded.  If you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', <nowiki>~~~~</nowiki>, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:
+
The event system supports both single-threaded and multi-threaded operationWhen using multiple threads, if you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the ''thread snake'', <nowiki>~~~~</nowiki>, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:
  
 
  <nowiki>
 
  <nowiki>

Latest revision as of 23:41, 10 November 2019

The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots. The event system is part of the ancillary neolib C++ utility library that is used by neoGFX.

To create an event handler simply use a lambda expression thus:

button1.clicked([](){ /* ... code ... */ });

If automatic event handler de-registration (traditional role of a "slot") is wanted:

neogfx::sink s;
s += button1.clicked([](){ /* ... code ... */ });

When 's' is destroyed any associated event registrations are de-registered automatically. Sink objects can be on the stack, member variables or the more traditional slot-like base class sub-object.

The event system supports both single-threaded and multi-threaded operation. When using multiple threads, if you want to handle the event in the same thread that is emitting the event rather than the thread that created the event handler then one simply uses the thread snake, ~~~~, which has the nice side effect of making it obvious that the lambda is being executed in a thread that may be different to that which is running the surrounding code:

/* ... code ... */
~~~~machine.started([](){ /* ... code ... */ });
/* ... code ... */

For defining events and triggering them:

class foo
{
public:
    neogfx::event<int> wibble;
public:
    void something()
    {
        wibble.trigger(42); // by default a synchronous trigger
        wibble.sync_trigger(42); // synchronous trigger
        wibble.async_trigger(42); // asynchronous trigger
    }
};