Wie schreibe ich mir ein Messaging System?
-
Hallo ihr erfahrenen Programmierer da draussen!
Ich bin ein n00b der fleissig am C++ lernen ist, aber in vielen Dingen noch absolut unversiert ist
Seit mehreren Tagen habe ich nun ein Problem, das ich trotz eifrigster Versuche und Tests nicht lösen konnte. Vielleicht kann mir hier ja jemand helfen.
Vorab: Mit den meisten Fachwörtern tue ich mich noch schwer, ich hoffe aber ihr versteht mich trotzdem.Problem:
Ich will mir ein System schreiben, dass Nachrichten in einen globalen Pool sendet, so dass ich immer und überall im Programm die Nachrichten auswerten und verarbeiten kann. Natürlich will ich analog dazu die Nachrichten auch immer und überall absenden können. Zu diesem Zweck hatte ich mir auch schon eine Event-Handler Klasse nach dem sog. C++ Native System geschrieben, die ich einmal global erzeugte und dann überall einband. Jedoch konnte ich dann in Klasse A nicht von Klasse B geschickte Nachrichten verarbeiten (trotz gleichen Objekts, das schickte und empfing).Weiss hier vielleicht jemand wie ich mein Problem prinzipiell einfach, schlicht und elegant lösen könnte? Ist der Event-Handler vielleicht der falsche Ansatz? Oder ist diese Lösung schon richtig, und wurde wahrscheinlich nur von mir falsch angewendet?
Ich bitte um Hilfe
byebye
-
Leg dir doch einfach ne globale std::vector oder so, der alle empfangenen Nachrichten speichert. Senden einfach hintendran hängen ...
-
Hmm, das werd ich wohl mal probieren. Thx für die Antwort. Ich hatte so etwas ähnliches schon einmal, aber diesmal werd ich dann kein Event-Handling System benutzen. Vielleicht klappts dann einfach mit nem globalem Vektor und 2 Funktionen anstatt der Event-Handling Klassen.
Andere Replies mit weiteren Ideen wären nett!
-
Google mal nach dem Mediator-Pattern. Könnte sein, dass das hilft.
-
Vielleicht solltest du noch mal genauer erläutern was du machen willst; wenn du Maxi2's Lösung in eine Klasse packst dann hast du eigentlich schon das Event-Handling-System was du willst:
template <class T> class EventHandler { public: struct Exception {}; static EventHandler<T>& getInstance() { static EventHandler<T> eh; return eh; } void postMessage( const T& msg ) { mMessages.push_back( msg ); } bool hasMessages() { return !mMessages.empty(); } T getMessage() { if ( !hasMessages() ) throw Exception(); T res = mMessages.front(); mMessages.pop_front(); return res; } private: std::list<T> mMessages; };
Jetzt einfach von überall per EventHandler<T>::getInstance() das Objekt holen und fröhlich Nachrichten austauschen
-
Danke für die Replies. Ich habe Maxis System ausprobiert, und hatte das gleiche problem wieder: Ich kann nicht in einer Klasse ein SendMessage ausführen und es dann in einer anderen verarbeiten;
Kann ich meinen Container nicht so global machen, dass ich von überall in ihn schreiben und aus ihm lesen kann? Muss ich mir wirklich erst die Klassen Instanz heranziehen wenn mich der Sender gar nicht interessiert sondern nur die Message?
Momentan binde ich den Message-Storage auf die folgende Weise ein:
event.h:
#ifndef _MESSAGE_QUEUE_DEFINED static vector<EDXMESSAGE> MessageQueue; #define _MESSAGE_QUEUE_DEFINED #endif
Ich binde also in jedes Script das Messages schicken soll diesen Header ein. Doch jedes Script scheint einen eigenen Speicherbereich dafür anzulegen, folglich kann ich nicht wirklich global Messages speichern. Kann mir bitte jemand erläutern wie ich das richtig mache? *beg*