#ifndef _TASK_H
#define _TASK_H
#pragma once
#include ".MyEvent.h"
#include ".Listener.h"
class __declspec(dllexport) CTask
...{
public:
CTask();
~CTask();
void SetListener(CListener*);
CListener* GetListener(void);
void SetEvent(CMyEvent*);
CMyEvent* GetEvent(void);
protected:
CListener* listener_p;
CMyEvent m_Event;
};
#endif
#include "stdafx.h"
#include ".Task.h"
CTask::CTask()
...{
}
CTask::~CTask()
...{
}
void CTask::SetListener(CListener* object_p)
...{
this->listener_p = object_p;
}
CListener* CTask::GetListener()
...{
return listener_p;
}
void CTask::SetEvent(CMyEvent* event_p)
...{
m_Event.m_InitialTick = event_p->m_InitialTick;
m_Event.m_NowTick = event_p->m_NowTick;
m_Event.m_Priority = event_p->m_Priority;
m_Event.m_Trigger = event_p->m_Trigger;
event_p->parameter_p->Copy(&(m_Event.parameter_p));
}
CMyEvent* CTask::GetEvent()
...{
return &m_Event;
}
TASKPOOL
#ifndef _TASKPOOL_H
#define _TASKPOOL_H
#pragma once
#include ".CircularLinkList.h"
#include ".TaskElement.h"
class __declspec(dllexport) CTaskPool
...{
public:
CTaskPool(void);
~CTaskPool(void);
void Initial(void);
void RaiseTask(CMyEvent*, CListener*);
void Prepare(void);
bool GetReadyEvent(CTokenElement**);
bool GetReadyEvent(CNote**);
void ReadyTaskMoveToFinishList(CNote*);
void ReadyTaskMoveToRunningList(CNote*);
void RunningTaskMoveToFinishList(CNote*);
void ReadyTaskMoveToBlockList(CNote*);
void BlockTaskMoveToReadyList(CNote*);
void Free(void);
private:
CCircularLinkList m_ReadyList;
CCircularLinkList m_RunningList;
CCircularLinkList m_FinishList;
CCircularLinkList m_BlockList;
CCriticalSection m_CriticalSection;
};

#endif/* _EVENTCELL_H */
#include "StdAfx.h"
#include ".TaskPool.h"
CTaskPool::CTaskPool(void)
...{
}
CTaskPool::~CTaskPool(void)
...{
}
void CTaskPool::Initial(void)
...{
m_CriticalSection.Lock();
m_CriticalSection.Unlock();
}
void CTaskPool::RaiseTask(CMyEvent* event_p, CListener* listener_p)
...{
CTaskElement* taskElement_p;
CTask* task_p;
m_CriticalSection.Lock();
task_p = new CTask();
task_p->SetEvent(event_p);
task_p->SetListener(listener_p);
taskElement_p = new CTaskElement();
taskElement_p->Set(task_p);
m_ReadyList.AppendTail((CTokenElement*)taskElement_p);
m_CriticalSection.Unlock();
}
void CTaskPool::Prepare(void)
...{
CNote* note_p;
m_CriticalSection.Lock();
/**//* ↓↓↓Remove finish task↓↓↓ */
while(m_FinishList.GetHeader(¬e_p))...{
m_FinishList.Remove(note_p);
}
/**//* ↑↑↑Remove finish task↑↑↑ */

while (m_BlockList.GetHeader(¬e_p))...{
BlockTaskMoveToReadyList(note_p);
}
m_CriticalSection.Unlock();
}
bool CTaskPool::GetReadyEvent(CTokenElement** element_dp)
...{
CNote* note_p;
bool result = false;
m_CriticalSection.Lock();
if (m_ReadyList.GetHeader(¬e_p))...{
*element_dp = note_p->element_p;
result = true;
}
m_CriticalSection.Unlock();
return result;
}

bool CTaskPool::GetReadyEvent(CNote** node_dp)
...{
m_CriticalSection.Lock();
return m_ReadyList.GetHeader(node_dp);
m_CriticalSection.Unlock();
}
void CTaskPool::ReadyTaskMoveToFinishList(CNote* node_p)
...{
m_CriticalSection.Lock();
m_ReadyList.PullOut(node_p);
m_FinishList.PushIn(node_p);
m_CriticalSection.Unlock();
}
void CTaskPool::ReadyTaskMoveToRunningList(CNote* node_p)
...{
m_CriticalSection.Lock();
m_ReadyList.PullOut(node_p);
m_RunningList.PushIn(node_p);
m_CriticalSection.Unlock();
}
void CTaskPool::RunningTaskMoveToFinishList(CNote* node_p)
...{
m_CriticalSection.Lock();
m_RunningList.PullOut(node_p);
m_FinishList.PushIn(node_p);
m_CriticalSection.Unlock();
}
void CTaskPool::ReadyTaskMoveToBlockList(CNote* node_p)
...{
m_CriticalSection.Lock();
m_ReadyList.PullOut(node_p);
m_BlockList.PushIn(node_p);
m_CriticalSection.Unlock();
}
void CTaskPool::BlockTaskMoveToReadyList(CNote* node_p)
...{
m_CriticalSection.Lock();
m_BlockList.PullOut(node_p);
m_ReadyList.PushIn(node_p);
m_CriticalSection.Unlock();
}
void CTaskPool::Free(void)
...{
m_CriticalSection.Lock();
this->m_FinishList.Free();
this->m_BlockList.Free();
this->m_ReadyList.Free();
this->m_RunningList.Free();
m_CriticalSection.Unlock();
}
本文介绍了一个基于C++的任务池实现方案,详细讲解了任务、监听器及事件等核心组件的设计,并展示了如何通过循环链表管理和调度不同状态的任务。
3888

被折叠的 条评论
为什么被折叠?



