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) {} }