#include <async_file_manager.h>
Inheritance diagram for NLMISC::CAsyncFileManager:

Nevrax France
Definition at line 41 of file async_file_manager.h.
Public Member Functions | |
| void | addLoadTask (IRunnable *ploadTask) |
| Add a load task in the CAsyncFileManager task list. | |
| void | addTask (IRunnable *, float priority=0) |
| Add a task to TaskManager and its priority. | |
| bool | cancelLoadTask (const ICancelCallback &cancelCallBack) |
| void | cancelSignal (bool *pSgn) |
| bool | deleteTask (IRunnable *r) |
| Delete a task, only if task is not running, return true if found and deleted. | |
| void | dump (std::vector< std::string > &result) |
| Dump task list. | |
| virtual void | getName (std::string &result) const |
| uint | getNumWaitingTasks () |
| Get number of waiting task. | |
| bool | isTaskRunning () const |
| Is there a current task ? | |
| bool | isThreadRunning () const |
| return false if exit() is required. task added with addTask() should test this flag. | |
| void | loadFile (const std::string &fileName, uint8 **pPtr) |
| void | loadFiles (const std::vector< std::string > &vFileNames, const std::vector< uint8 ** > &vPtrs) |
| void | registerTaskPriorityCallback (IChangeTaskPriority *callback) |
| Register task priority callback. | |
| void | run (void) |
| Manage TaskQueue. | |
| void | signal (bool *pSgn) |
| void | sleepTask (void) |
| Sleep a Task. | |
| uint | taskListSize (void) |
| Task list size. | |
Static Public Member Functions | |
| CAsyncFileManager & | getInstance () |
| void | terminate () |
Protected Member Functions | |
| void | waitCurrentTaskToComplete () |
Protected Attributes | |
| CSynchronized< std::list< std::string > > | _DoneTaskQueue |
| CSynchronized< std::string > | _RunningTask |
| queue of tasks, using list container instead of queue for DeleteTask methode | |
| CSynchronized< std::list< CWaitingTask > > | _TaskQueue |
| IThread * | _Thread |
| thread pointer | |
| volatile bool | _ThreadRunning |
| flag indicate thread loop, if false cause thread exit | |
Private Member Functions | |
| CAsyncFileManager () | |
Static Private Attributes | |
| CAsyncFileManager * | _Singleton = NULL |
|
|
Definition at line 40 of file async_file_manager.cpp. Referenced by getInstance().
00041 {
00042 }
|
|
|
Add a load task in the CAsyncFileManager task list.
Definition at line 67 of file async_file_manager.cpp. References NLMISC::CTaskManager::addTask().
00068 {
00069 addTask(ploadTask);
00070 }
|
|
||||||||||||
|
Add a task to TaskManager and its priority.
Definition at line 126 of file task_manager.cpp. References NLMISC::CTaskManager::_TaskQueue, and r. Referenced by addLoadTask(), NL3D::CZoneManager::checkZonesAround(), loadFile(), loadFiles(), and signal().
00127 {
00128 CSynchronized<std::list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00129 acces.value().push_back(CWaitingTask(r, priority));
00130 }
|
|
|
Call this method to cancel a programmed load.
Definition at line 72 of file async_file_manager.cpp. References NLMISC::CAsyncFileManager::ICancelCallback::callback(), and NLMISC::CTaskManager::waitCurrentTaskToComplete().
00073 {
00074 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00075 list<CWaitingTask> &rTaskQueue = acces.value ();
00076 list<CWaitingTask>::iterator it = rTaskQueue.begin();
00077
00078 while (it != rTaskQueue.end())
00079 {
00080 IRunnable *pR = it->Task;
00081
00082 // check the task with the cancel callback.
00083 if (callback.callback(pR))
00084 {
00085 // Delete the load task
00086 delete pR;
00087 rTaskQueue.erase (it);
00088 return true;
00089 }
00090 ++it;
00091 }
00092
00093 // If not found, the current running task may be the one we want to cancel. Must wait it.
00094 waitCurrentTaskToComplete ();
00095
00096 return false;
00097 }
|
|
|
Definition at line 170 of file async_file_manager.cpp. References NLMISC::CAsyncFileManager::CSignal::Sgn.
00171 {
00172 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00173 list<CWaitingTask> &rTaskQueue = acces.value ();
00174 list<CWaitingTask>::iterator it = rTaskQueue.begin();
00175
00176 while (it != rTaskQueue.end())
00177 {
00178 IRunnable *pR = it->Task;
00179 CSignal *pS = dynamic_cast<CSignal*>(pR);
00180 if (pS != NULL)
00181 {
00182 if (pS->Sgn == pSgn)
00183 {
00184 // Delete signal task
00185 delete pS;
00186 rTaskQueue.erase (it);
00187 return;
00188 }
00189 }
00190 ++it;
00191 }
00192 }
|
|
|
Delete a task, only if task is not running, return true if found and deleted.
Definition at line 133 of file task_manager.cpp. References NLMISC::CTaskManager::_TaskQueue, and r.
00134 {
00135 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00136 for(list<CWaitingTask>::iterator it = acces.value().begin(); it != acces.value().end(); it++)
00137 {
00138 if(it->Task == r)
00139 {
00140 acces.value().erase(it);
00141 return true;
00142 }
00143 }
00144 return false;
00145 }
|
|
|
Dump task list.
Definition at line 163 of file task_manager.cpp. References NLMISC::CTaskManager::_DoneTaskQueue, NLMISC::CTaskManager::_RunningTask, NLMISC::CTaskManager::_TaskQueue, and NLMISC::toString().
00164 {
00165 CSynchronized<string>::CAccessor accesCurrent(&_RunningTask);
00166 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00167 CSynchronized<list<string> >::CAccessor accesDone(&_DoneTaskQueue);
00168
00169 const list<CWaitingTask> &taskList = acces.value();
00170 const list<string> &taskDone = accesDone.value();
00171 const string &taskCurrent = accesCurrent.value();
00172
00173 // Resize the destination array
00174 result.clear ();
00175 result.reserve (taskList.size () + taskDone.size () + 1);
00176
00177 // Add the waiting strings
00178 list<string>::const_reverse_iterator iteDone = taskDone.rbegin ();
00179 while (iteDone != taskDone.rend ())
00180 {
00181 result.push_back ("Done : " + *iteDone);
00182
00183 // Next task
00184 iteDone++;
00185 }
00186
00187 // Add the current string
00188 if (!taskCurrent.empty())
00189 {
00190 result.push_back ("Current : " + taskCurrent);
00191 }
00192
00193 // Add the waiting strings
00194 list<CWaitingTask>::const_iterator ite = taskList.begin ();
00195 while (ite != taskList.end ())
00196 {
00197 string name;
00198 ite->Task->getName (name);
00199 result.push_back ("Waiting : " + name + " " + toString(ite->Priority));
00200
00201 // Next task
00202 ite++;
00203 }
00204 }
|
|
|
Definition at line 46 of file async_file_manager.cpp. References CAsyncFileManager(). Referenced by terminate().
00047 {
00048 if (_Singleton == NULL)
00049 {
00050 _Singleton = new CAsyncFileManager();
00051 }
00052 return *_Singleton;
00053 }
|
|
|
Reimplemented in NL3D::CAsyncFileManager3D::CMeshLoad, NL3D::CAsyncFileManager3D::CIGLoad, NL3D::CAsyncFileManager3D::CIGLoadUser, NL3D::CAsyncFileManager3D::CTextureLoad, NL3D::CZoneLoadingTask, NLPACS::CGlobalRetriever::CLrLoader, NLMISC::CAsyncFileManager::CFileLoad, NLMISC::CAsyncFileManager::CMultipleFileLoad, and NLMISC::CAsyncFileManager::CSignal. Definition at line 74 of file thread.h. Referenced by NLMISC::CTaskManager::run().
00075 {
00076 result = "NoName";
00077 }
|
|
|
Get number of waiting task.
Definition at line 208 of file task_manager.cpp. References NLMISC::CTaskManager::_TaskQueue, and uint.
00209 {
00210 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00211 return acces.value().size();
00212 }
|
|
|
Is there a current task ?
Definition at line 90 of file task_manager.h. References NLMISC::CTaskManager::_IsTaskRunning.
00090 {return _IsTaskRunning;}
|
|
|
return false if exit() is required. task added with addTask() should test this flag.
Definition at line 81 of file task_manager.h. References NLMISC::CTaskManager::_ThreadRunning.
00081 {return _ThreadRunning;}
|
|
||||||||||||
|
Definition at line 149 of file async_file_manager.cpp. References NLMISC::CTaskManager::addTask(), and uint8.
00150 {
00151 addTask (new CFileLoad (sFileName, ppFile));
00152 }
|
|
||||||||||||
|
Definition at line 156 of file async_file_manager.cpp. References NLMISC::CTaskManager::addTask().
00157 {
00158 addTask (new CMultipleFileLoad (vFileNames, vPtrs));
00159 }
|
|
|
Register task priority callback.
Definition at line 237 of file task_manager.cpp. References NLMISC::CTaskManager::_ChangePriorityCallback.
00238 {
00239 _ChangePriorityCallback = callback;
00240 }
|
|
|
Manage TaskQueue.
Implements NLMISC::IRunnable. Definition at line 61 of file task_manager.cpp. References NLMISC::CTaskManager::_DoneTaskQueue, NLMISC::CTaskManager::_IsTaskRunning, NLMISC::CTaskManager::_RunningTask, NLMISC::CTaskManager::_TaskQueue, NLMISC::CTaskManager::_ThreadRunning, NLMISC::CTaskManager::changeTaskPriority(), NLMISC::IRunnable::getName(), NLMISC_DONE_TASK_SIZE, NLMISC::IRunnable::run(), NLMISC::CTaskManager::sleepTask(), and NLMISC::toString().
00062 {
00063 IRunnable *runnableTask;
00064 float priorityTask;
00065 while(_ThreadRunning)
00066 {
00067 {
00068 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00069 if(acces.value().empty())
00070 {
00071 runnableTask = NULL;
00072 }
00073 else
00074 {
00075 // Update task priorities
00076 changeTaskPriority ();
00077
00078 // Get the best task
00079 list<CWaitingTask> &taskList = acces.value();
00080 list<CWaitingTask>::iterator ite = taskList.begin();
00081 list<CWaitingTask>::iterator bestIte = ite;
00082 while (ite != taskList.end())
00083 {
00084 if (ite->Priority < bestIte->Priority)
00085 bestIte = ite;
00086
00087 // Next task;
00088 ite++;
00089 }
00090
00091 _IsTaskRunning = true;
00092 runnableTask = bestIte->Task;
00093 priorityTask = bestIte->Priority;
00094 taskList.erase (bestIte);
00095 }
00096 }
00097 if(runnableTask)
00098 {
00099 {
00100 CSynchronized<string>::CAccessor currentTask(&_RunningTask);
00101 string temp;
00102 runnableTask->getName(temp);
00103 currentTask.value () = temp + " " + toString (priorityTask);
00104 }
00105 runnableTask->run();
00106 {
00107 CSynchronized<string>::CAccessor currentTask(&_RunningTask);
00108 CSynchronized<list<string> >::CAccessor doneTask(&_DoneTaskQueue);
00109 doneTask.value().push_front (currentTask.value ());
00110 currentTask.value () = "";
00111 if (doneTask.value().size () > NLMISC_DONE_TASK_SIZE)
00112 doneTask.value().resize (NLMISC_DONE_TASK_SIZE);
00113 }
00114
00115 _IsTaskRunning = false;
00116 }
00117 else
00118 {
00119 sleepTask();
00120 }
00121 }
00122 _ThreadRunning = true;
00123 }
|
|
|
Definition at line 163 of file async_file_manager.cpp. References NLMISC::CTaskManager::addTask().
00164 {
00165 addTask (new CSignal (pSgn));
00166 }
|
|
|
Sleep a Task.
Definition at line 75 of file task_manager.h. References NLMISC::nlSleep(). Referenced by NLMISC::CTaskManager::run(), and NLMISC::CTaskManager::waitCurrentTaskToComplete().
00075 { nlSleep(10); }
|
|
|
Task list size.
Definition at line 148 of file task_manager.cpp. References NLMISC::CTaskManager::_TaskQueue, and uint.
00149 {
00150 CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue);
00151 return acces.value().size();
00152 }
|
|
|
Definition at line 57 of file async_file_manager.cpp. References getInstance().
00058 {
00059 if (_Singleton != NULL)
00060 {
00061 delete &getInstance();
00062 _Singleton = NULL;
00063 }
00064 }
|
|
|
If any, wait the current running task to complete this function MUST be called in a 'accessor to the _TaskQueue' statement because a mutex is required eg: { CSynchronized<list<IRunnable *> >::CAccessor acces(&_TaskQueue); waitCurrentTaskToComplete(); } Definition at line 155 of file task_manager.cpp. References NLMISC::CTaskManager::_IsTaskRunning, and NLMISC::CTaskManager::sleepTask(). Referenced by cancelLoadTask().
00156 {
00157 while (_IsTaskRunning)
00158 sleepTask();
00159 }
|
|
|
Definition at line 148 of file task_manager.h. Referenced by NLMISC::CTaskManager::dump(), and NLMISC::CTaskManager::run(). |
|
|
queue of tasks, using list container instead of queue for DeleteTask methode
Definition at line 146 of file task_manager.h. Referenced by NLMISC::CTaskManager::CTaskManager(), NLMISC::CTaskManager::dump(), and NLMISC::CTaskManager::run(). |
|
|
Definition at line 36 of file async_file_manager.cpp. |
|
|
|
thread pointer
Definition at line 151 of file task_manager.h. Referenced by NLMISC::CTaskManager::CTaskManager(). |
|
|
flag indicate thread loop, if false cause thread exit
Definition at line 154 of file task_manager.h. Referenced by NLMISC::CTaskManager::CTaskManager(), NLMISC::CTaskManager::isThreadRunning(), NLMISC::CTaskManager::run(), and NLMISC::CTaskManager::~CTaskManager(). |
1.3.6