Hi People,
I'm studying boost to understand if I can remove from a project a homemade event-dispatcher with boost::signal2 but I found a lot of troubles and I cannot solve it.
My actual code which I would migrate to boost is made by a "Sender" and "Multiple Receiver"
The sender has the ability to register many "signals" (I use a map for do this" ) and each listener has a map of "slots" connected to the sender of the sender.
The sender code is:
struct Event {};
struct ID {};
struct OneSecondElapsedEvent : public Event
{
static ID id;
};
struct UpdatePresentationTracksReqEvent : public Event
{
UpdatePresentationTracksReqEvent() {};
static ID id;
};
typedef boost::signals2::signal<void (Event*)> signal_t;
typedef signal_t::slot_type slot_t;
class MainTask: public Elt::Thread , public Sender
{
boost::ptr_map<ID*, signal_t> signals_map;
public:
sig;
MainTask(char* taskName);
virtual ~MainTask();
void Main();
void registerListener(IListener* listener)
{
if(listener != NULL)
{
SlotMap::const_iterator it = listener->slots_map.begin();
for(;it != listener->slots_map.end();it++)
{
ID *id = it->first;
const slot_t *handler = it->second;
signals_map[id].connect(*handler);
}
}
else
printf("Listener NULLO!!!!\n");
}
};
now my generic "listener" or Receiver should be able to register to sender and the code is:
#include "SpActiveContext.h"
#include <cassert>
#include "ActiveObject.h"
#include "GenericMessageHandler/ActiveMessage.h"
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include <stdio.h>
#include "EventDefinitions.h"
#include "MainTask.h"
SpActiveContext::SpActiveContext(SpContext * component): _ActiveObject("SpActiveContext"), _Component(component){
assert(_Component);
//boost::function<void (OneSecondElapsedEvent*)> g = boost::bind(&SpActiveContext::Handle, this, _1);
//const slot_t& t = static_cast<void (SpActiveContext::*)(OneSecondElapsedEvent* )>(&SpActiveContext::Handle);
//registerEvent(OneSecondElapsedEvent::id, t);
//typedef boost::signals2::signal<void (Event*)> signal_t;
//typedef signal_t::slot_type slot_t;
//boost::bind(&SpActiveContext::Handle(OneSecondElapsedEvent*), this, _1);
//void (SpActiveContext::*Handle) (OneSecondElapsedEvent*) = &SpActiveContext::Handle;
//boost::bind( static_cast<void (SpActiveContext::*)( int )>(&Foo::Bar) , foo, _1);
//const slot_t1& t = boost::bind( static_cast<void (SpActiveContext::*)(OneSecondElapsedEvent*)>(&SpActiveContext::Handle) , this, _1);
//registerEvent(OneSecondElapsedEvent::id, t );
//const slot_t1& t = boost::bind( static_cast<void (SpActiveContext::*)(UpdatePresentationTracksReqEvent
*)>(&SpActiveContext::Handle) , this, _1);
//registerEvent(UpdatePresentationTracksReqEvent
::id, t );
}
void SpActiveContext::Handle(OneSecondElapsedEvent* msg)
{
printf("OneSecondElapsedEvent 2\n");
}
void SpActiveContext::Handle(UpdatePresentationTracksReqEvent* msg)
{
printf("UpdatePresentationTracksReqEvent\n");
}
In the constructor I tried to "connect" the function "Handle(OneSecondElapsedEvent*)" to the slot but I cannot to this..the compiler write errors sayng that cannot connvert from "Event*" to "OneSecondElapsedEvent*".
Is there any solution to make it working?
Thanks in advance,
AlexGiul