Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "Task.h"
- namespace rcr {
- TaskMgr::TaskMgr() {
- int numCPUs = Thread::GetCPUCount();
- for (int i = 0; i < numCPUs; i++) {
- WorkerThread* newThread = new WorkerThread();
- newThread->m_taskMgr = this;
- m_apxThreads.Add(newThread);
- }
- }
- TaskMgr::~TaskMgr() {
- Stop();
- while (m_apxTodo.GetSize()>0) {
- m_apxTodo.Delete(0);
- }
- while (m_apxThreads.GetSize() > 0) {
- m_apxThreads.Delete(0);
- }
- }
- void TaskMgr::Start() {
- for (int i = 0; i < m_apxThreads.GetSize(); i++) {
- m_apxThreads[i]->RunMultiThreaded();
- }
- }
- void TaskMgr::Stop() {
- for (int i = 0; i < m_apxThreads.GetSize(); i++) {
- m_apxThreads[i]->Quit(true);
- }
- }
- rcr::TaskPtr TaskMgr::Add(TaskPtr p_taskPtr) {
- //Add: Lock->Add.>Unlock->Signal
- m_lock.Lock();
- m_apxTodo.Add(p_taskPtr);
- m_lock.Unlock();
- m_signal.Signal();
- return p_taskPtr;
- }
- TaskMgr::WorkerThread::WorkerThread() {
- }
- TaskMgr::WorkerThread::~WorkerThread() {
- }
- void TaskMgr::WorkerThread::Run() {
- //WT: Lock->Get->Unlock HaveWork: TaskRun NoWork: WaitSignal
- while (!this->isQuitting()){
- if (m_taskMgr->m_signal.Wait()) {
- m_taskMgr->m_lock.Lock();
- TaskPtr cTask = m_taskMgr->m_apxTodo[m_taskMgr->m_apxTodo.GetSize()-1];
- m_taskMgr->m_apxTodo.Delete(m_taskMgr->m_apxTodo.GetSize()-1);
- m_taskMgr->m_lock.Unlock();
- cTask->Run();
- //delete cTask;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement