Re: C++ threading could be so simple...
Kian Karas wrote:
Threads with undeterministic communication (semi-random input/output)
are usually (and best) implemented with some kind of message loop.
However, this gives the headache of having to maintain a switch that,
based on a message ID, cast's the generic base class to a concrete
message.
The switch-base approach is wrong: you must know all your
msg_ids in advance and must update the implementation when
the set grows, which is error-prone. It doesn't work if the new
msg type comes from, say, a plugin.
For that reason I have implemented a message type-based
dispatcher, which dispatches the call to the best matching
handler, which can be a function, a method ora a delegate.
The term "best matching" means that the dynamic type of the
first actual parameter is closest to the handler's static parameter
type in terms of inheritance depth. For instance:
class B { virtual ~B(); };
class C : public B {};
int handle_B(const B&, float) { return 0; }
int handle_C(const C&, float) { return 1; }
dynamic_dispatch<int (const B&, float)> dd(&handle_B); // one must
// always provide a default handler
dd.attach(&handle_C); // register a handler for C, the call may be
located in a plugin
C c;
const B& b = c;
auto r = dd(b, 0.0); // handle_C will be called
However, it uses GCC's cxxabi.h to traverse the list of base classes
of a given class (via casting std::type_info to something else), so,
strictly
speaking, it is not a C++0x program. But, since the only compiler I'm
interested in is GCC, this is a non-issue. I also use this "design pattern"
in many other places, e.g. exception remapping.
This is usually quite trivial: To keep the switch as small as
possibly, you would probably use the message ID to cast the message,
extract the members and call a function that handles that specific
message (passing it the members of the message).
A message is not the correct place to store its handling details
information.
Best regards
Piotr Wyderski
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]