Difference between revisions of "neoGFX Event System"

From neoGFX
Jump to: navigation, search
(Created page with "The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots. To create an event handler can simply use a lambda expression thus...")
(No difference)

Revision as of 18:21, 3 May 2018

The neoGFX event system is both modern and simple and is an improvement over traditional signals and slots.

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

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

If you want automatic event de-registration (traditional role of a "slot"):

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 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 a "thread snake", ~~~~, to make 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 ... */

To define your own events and trigger 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
    }
};