<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ein EventManager]]></title><description><![CDATA[<p>Abend.<br />
Erstmal ein wenig code für euch meine Lieben:</p>
<pre><code>class IEventData
{ 
public:
   IEventData() {};
};

class IEventReceiver
{
public:
   virtual void OnEvent(int evt, IEventData* data) = 0;
};

struct Events
{ 
    int m_event;
    std::list&lt;IEventReceiver*&gt; m_records;
};

class EventManager
{
public:
    // Registriert ein Event und fügt es der Liste hinzu.
    void RegisterEvent(int evt);
    // Entfernt ein Event und all seine Receiver.
    void UnregisterEvent(int evt);
    // registriert einen Receiver für ein Event. Jeder Receiver kann so viele 
    //Events registrieren wie er möchte, damit ein Interface reicht. 
    void RegisterReceiver(int evt, IEventReceiver* rec);
    // Entfernt einen Receiver für ein best. Event
    void UnregisterReceiver(int evt, IEventReceiver* rec);

    // Geht die Liste durch und sucht nach einem Event. Wenn das Event 
    // gefunden wurde, ruft er alle receiver auf (OnEvent) und gibt die
    // event-daten weiter, die mit reinterpret_cast auf den jeweiligen typ
    // gecastet werden müssen, wie als bsp KeyDownEventData.
    void Notify(int evt, IEventData* data = NULL);

    // Hält alle Events und deren Receiver in einer liste.
    std::list&lt;Events&gt; m_eventlist;
};
</code></pre>
<p>Was haltet Ihr so davon? Könnte das zu Problemen in der performance führen mit den Listen? Was wäre der Gegenvorschlag? Das Ding muss halt schon performant sein, damit die Calls schnell ausgeführt werden können. Eine Instanz dieses Managers wird über einen Getter in einer anderen Klasse &quot;global&quot; zur Verfügung gestellt.<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219334/ein-eventmanager</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:54:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219334.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Aug 2008 14:20:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ein EventManager on Fri, 01 Aug 2008 14:20:14 GMT]]></title><description><![CDATA[<p>Abend.<br />
Erstmal ein wenig code für euch meine Lieben:</p>
<pre><code>class IEventData
{ 
public:
   IEventData() {};
};

class IEventReceiver
{
public:
   virtual void OnEvent(int evt, IEventData* data) = 0;
};

struct Events
{ 
    int m_event;
    std::list&lt;IEventReceiver*&gt; m_records;
};

class EventManager
{
public:
    // Registriert ein Event und fügt es der Liste hinzu.
    void RegisterEvent(int evt);
    // Entfernt ein Event und all seine Receiver.
    void UnregisterEvent(int evt);
    // registriert einen Receiver für ein Event. Jeder Receiver kann so viele 
    //Events registrieren wie er möchte, damit ein Interface reicht. 
    void RegisterReceiver(int evt, IEventReceiver* rec);
    // Entfernt einen Receiver für ein best. Event
    void UnregisterReceiver(int evt, IEventReceiver* rec);

    // Geht die Liste durch und sucht nach einem Event. Wenn das Event 
    // gefunden wurde, ruft er alle receiver auf (OnEvent) und gibt die
    // event-daten weiter, die mit reinterpret_cast auf den jeweiligen typ
    // gecastet werden müssen, wie als bsp KeyDownEventData.
    void Notify(int evt, IEventData* data = NULL);

    // Hält alle Events und deren Receiver in einer liste.
    std::list&lt;Events&gt; m_eventlist;
};
</code></pre>
<p>Was haltet Ihr so davon? Könnte das zu Problemen in der performance führen mit den Listen? Was wäre der Gegenvorschlag? Das Ding muss halt schon performant sein, damit die Calls schnell ausgeführt werden können. Eine Instanz dieses Managers wird über einen Getter in einer anderen Klasse &quot;global&quot; zur Verfügung gestellt.<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557657</guid><dc:creator><![CDATA[Script0r]]></dc:creator><pubDate>Fri, 01 Aug 2008 14:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Ein EventManager on Fri, 01 Aug 2008 15:34:38 GMT]]></title><description><![CDATA[<p>Wäre mir zu primitiv, aber wenn es für deine Zwecke ausreichend ist.</p>
<p>Ich würde als erste Änderung Queues benutzen welche die Events speichern, so dass das Erzeugen eines Events in O(1) liegt, und dann von Zeit zu Zeit die Events abarbeiten.<br />
Falls man wirklich einmal ein Event hat das sofort versandt werden soll, dann würde ich das so wie ein EventManager handhaben, also einmal kurz alle Receiver durchgehen und die benachrichtigen (da wäre zu überlegen ob man in solch einer Schleife dann das sofortige Benachrichtigen deaktiviert damit das nicht passiert was ich weiter unten geschrieben habe).</p>
<p>Übrigens wenn deine Receiver selber Events versenden, dann wird das ganze recht undurchsichtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557668</guid><dc:creator><![CDATA[Tippgeber]]></dc:creator><pubDate>Fri, 01 Aug 2008 15:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ein EventManager on Fri, 01 Aug 2008 18:19:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Könnte das zu Problemen in der performance führen mit den Listen?</p>
</blockquote>
<p>Ja, die std::list&lt;Events&gt; m_eventlist wird wohl bremsen wenn mal viele Events registriert sind, weil du die von Anfang bis Ende durchsuchen musst (bis du den passenden Eintrag gefunden hast, was für den letzten Eintrag dann recht lange dauern kann).</p>
<blockquote>
<p>Was wäre der Gegenvorschlag?</p>
</blockquote>
<p>std::map verwenden.</p>
<pre><code>// z.b.
std::map&lt;int, std::set&lt;IEventReceiver*&gt; &gt; m_blubb;
// oder gleich
std::map&lt;int, std::set&lt;boost::shared_ptr&lt;boost::function&lt;void()&gt; &gt; &gt; &gt; m_blubb;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1557733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557733</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Aug 2008 18:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Ein EventManager on Fri, 01 Aug 2008 18:37:02 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>Könnte das zu Problemen in der performance führen mit den Listen?</p>
</blockquote>
<p>Ja, die std::list&lt;Events&gt; m_eventlist wird wohl bremsen wenn mal viele Events registriert sind, weil du die von Anfang bis Ende durchsuchen musst (bis du den passenden Eintrag gefunden hast, was für den letzten Eintrag dann recht lange dauern kann).</p>
<blockquote>
<p>Was wäre der Gegenvorschlag?</p>
</blockquote>
<p>std::map verwenden.</p>
<pre><code>// z.b.
std::map&lt;int, std::set&lt;IEventReceiver*&gt; &gt; m_blubb;
// oder gleich
std::map&lt;int, std::set&lt;boost::shared_ptr&lt;boost::function&lt;void()&gt; &gt; &gt; &gt; m_blubb;
</code></pre>
</blockquote>
<p>Zuerst einmal sollte man herausfinden wie viele Receiver es im Normalfall geben wird, denn bei nur wenigen ist die Liste schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557747</guid><dc:creator><![CDATA[fricky]]></dc:creator><pubDate>Fri, 01 Aug 2008 18:37:02 GMT</pubDate></item><item><title><![CDATA[Reply to Ein EventManager on Sat, 02 Aug 2008 00:22:22 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23441">@fricky</a>: hängt von der implementierung ab. wird sich aber nicht viel reissen. schlaumeier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557882</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 02 Aug 2008 00:22:22 GMT</pubDate></item></channel></rss>