2011/11/24更新 単純な状態遷移ならば有限状態機械で十分なのですが、 今回の全ファイル つまり、タスクシステムとは、処理をオブジェクト単位(タスク)で扱い、 タスクシステム実装にあたり、メモリプールと呼ばれる連続メモリ領域をあらかじめ用意し、 タスクには予め優先度の情報を持たせておき さらにタスク生成のため、タスクのサイズ分確保できるメモリ領域の探索が必要になるわけですが 連続メモリの容量は予め決められたサイズなので 通常のポインタでタスク間の連結を実装してしまうと タスクの削除についてですが タスクの差し替えに関しては、指定IDのタスクを削除して新しいタスクを追加するので説明は不要でしょう 追加済みのタスクの優先度を変更させることもできます 今回の実装は 使い方は以下のようにします main.cpp #include "task.h" #include <crtdbg.h> #include <windows.h> #include <conio.h> class InputTask; class NetworkTask; class DrawTask; class Draw3DTask; class Draw2DTask; class DrawObjectTask; // タスクID enum{ TASKID_INPUT, TASKID_NETWORK, TASKID_DRAW, TASKID_DRAW3D, TASKID_DRAW2D }; class TaskSystemEx : public TaskSystem { public: int common; // タスク間共通データ TaskSystemEx():common(0){} virtual ~TaskSystemEx(){} }; // キャストめんどくさいので置き換え #define m_pTaskSystemEx dynamic_cast<TaskSystemEx*>(m_pTaskSystem) class InputTask : public Task { public: virtual void Execute(){ m_pTaskSystemEx->common++; printf("%d周目 InputTask id = %d\n",m_pTaskSystemEx->common,GetTaskID()); m_pTaskSystem->AddTask<NetworkTask>(TASKID_NETWORK); } }; class NetworkTask : public Task { public: virtual void Execute(){ printf("%d周目 NetworkTask id = %d\n",m_pTaskSystemEx->common,GetTaskID()); m_pTaskSystem->AddTask<DrawTask>(TASKID_DRAW); } }; class DrawTask : public Task { public: virtual void Execute(){ printf("%d周目 DrawTask id = %d\n",m_pTaskSystemEx->common,GetTaskID()); m_pTaskSystem->AddTask<InputTask>(TASKID_INPUT); // プライオリティでタスクの割り込み(低い順に実行される) for(int i = 0;i < 10;++i) m_pTaskSystem->AddTask<Draw2DTask>(TASKID_DRAW2D,(double)rand()/RAND_MAX * 0.5); for(int i = 0;i < 10;++i) m_pTaskSystem->AddTask<Draw3DTask>(TASKID_DRAW3D,0.2); // (現在実行中以外の)指定のIDのタスクを全て差し替え m_pTaskSystem->SwapTask<DrawObjectTask>(TASKID_DRAW3D); // (現在実行中以外の)全タスクを全て削除 //m_pTaskSystem->DeleteAllTask(); // (現在実行中以外の)指定のIDのタスクの優先度を全て差し替え m_pTaskSystem->SetTaskPriority(TASKID_DRAW3D,0.3); // (現在実行中以外の)指定のIDのタスクを全て削除 //m_pTaskSystem->DeleteTask(TASKID_DRAW2D); } }; class Draw3DTask : public Task { public: char a[100]; // 適当なデータ virtual void Execute(){ printf("%d周目 Draw3DTask id = %d\n",m_pTaskSystemEx->common,GetTaskID()); } }; class Draw2DTask : public Task { public: char a[120];// 適当なデータ virtual void Execute(){ printf("%d周目 Draw2DTask id = %d priority = %lf\n",m_pTaskSystemEx->common, GetTaskID(),GetPriority()); } }; class DrawObjectTask : public Task { public: virtual void Execute(){ printf("%d周目 DrawObject id = %d priority = %lf\n",m_pTaskSystemEx->common, GetTaskID(),GetPriority()); } }; int main() { #ifdef _DEBUG _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); //_CrtSetBreakAlloc(x); #endif TaskSystemEx tasksystem; tasksystem.Create(1000); tasksystem.AddTask<InputTask>(TASKID_INPUT); while(tasksystem.ExecuteTask()){ // 出力が見やすいように0.1秒休む //Sleep(100); // キー入力で終了 if(_kbhit()) break; } // メモリダンプ tasksystem.Dump("dump.txt"); return 0; } 追記:デフラグの処理は追加してあるのですが、 vote(理解できた(^ω^)[4],なんぞこれーΣ(゚д゚lll)[6],ちょっと理解できないですね(´・ω・`)[4]) |