a implementation of template class that is used for create event-driven task thread.

Revision:
0:1f4516e81c1b
diff -r 000000000000 -r 1f4516e81c1b Actor.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Actor.cpp	Wed May 20 08:11:04 2015 +0000
@@ -0,0 +1,55 @@
+#include "Actor.h"
+
+Actor::Actor() :
+    thread(&Actor::threadKicker, this, osPriorityNormal, STACK_SIZE)
+{
+    thread.signal_set(START_THREAD);
+}
+
+Actor::~Actor()
+{
+}
+
+void Actor::threadMain()
+{
+    printf("thread main\n");
+    osEvent event;
+    while(true) {
+        event = mbox.get();
+        if (event.status == osEventMail) {
+            MailPacket *mail = (MailPacket*)event.value.p;
+            if (joblist[mail->messageId] != NULL) {
+                joblist[mail->messageId](mail->packet);
+            }
+            mbox.free(mail);
+        }
+    }
+}
+
+void Actor::subscribe(MessageID msg, void(*task)(void *))
+{
+    printf("subsc\n");
+    joblist[msg] = task;
+}
+
+void Actor::unsubscribe(MessageID msg)
+{
+    printf("unsub\n");
+    joblist.erase(msg);
+}
+
+void Actor::sendMail(Actor *dest, MessageID msg, void *pkt)
+{
+    printf("sendMail\n");
+    MailPacket *mail = dest->mbox.alloc();
+    mail->messageId  = msg;
+    mail->packet     = pkt;
+    dest->mbox.put(mail);
+}
+
+void Actor::threadKicker(void const *p)
+{
+    printf("thread kicker\n");
+    Actor *instance = (Actor*)p;
+    instance->threadMain();
+}