mbed で非同期メッセージドリブンなスレッドクラスを作った(2)

sabme.hatenablog.com
前の記事で書いた通り、subscribeでメンバ関数以外も登録できるようにしてみました。
実行結果は前回と同じ。自由度は高いけど、これはこれでどうかと思う。

#include <stdlib.h>
#include <string>
#include "mbed.h"
#include "rtos.h"

#include "Actor.h"

Serial pc(USBTX, USBRX);
Timer tim;

class Task : public Actor {
public:
    static const MessageID MSG_JOB_START = 0x01;

    void setPriority(osPriority lv) { thread.set_priority(lv); }
};

Task *taskA;
Task *taskB;
Task *taskC;

void jobA(void *p) {
    int cnt = rand() % 100000000;
    printf("%6d [TaskA] start\n", tim.read_ms());
    for (int i = 0; i < cnt; i++) { /* nop */ }
    printf("%6d [TaskA] end\n", tim.read_ms());
    sendMail(taskB, Task::MSG_JOB_START, NULL);
}

void jobB(void *p) {
    int cnt = rand() % 100000000;
    printf("%6d [TaskB] start\n", tim.read_ms());
    for (int i = 0; i < cnt; i++) { /* nop */ }
    printf("%6d [TaskB] end\n", tim.read_ms());
    sendMail(taskC, Task::MSG_JOB_START, NULL);
}

void jobC(void *p) {
    int cnt = rand() % 100000000;
    printf("%6d [TaskC] start\n", tim.read_ms());
    for (int i = 0; i < cnt; i++) { /* nop */ }
    printf("%6d [TaskC] end\n", tim.read_ms());
}

int main()
{
    tim.start();

    taskA = new Task();
    taskA->subscribe(Task::MSG_JOB_START, jobA);

    taskB = new Task();
    taskB->subscribe(Task::MSG_JOB_START, jobB);

    taskC = new Task();
    taskC->subscribe(Task::MSG_JOB_START, jobC);
    taskC->setPriority(osPriorityHigh);

    for (int i=0; i<5; i++) {
        sendMail(taskA, Task::MSG_JOB_START, NULL); // input job
    }

    while (true) {}
}