00001
00002
00003
00004
00005
00006
00007
00008
00010
00011 #include "taskqueue.h"
00012 #include <sys/time.h>
00013 #include <qdatetime.h>
00014
00015 #include <iostream>
00016
00017 using std::cerr;
00018
00020
00022
00023 TaskQueue *g_pTaskQueue;
00024
00027
00028
00029
00032
00033 long Task::m_nTaskCount = 0;
00034
00036
00038
00039 Task::Task()
00040 {
00041 m_nTaskId = m_nTaskCount++;
00042 }
00043
00045
00047
00048 Task::~Task()
00049 {
00050 }
00051
00054
00055
00056
00059
00061
00063
00064 TaskQueue::TaskQueue() : m_bTermRequested( false )
00065 {
00066
00067 }
00068
00070
00072
00073 TaskQueue::~TaskQueue()
00074 {
00075 m_bTermRequested = true;
00076
00077 wait();
00078
00079 Clear();
00080 }
00081
00083
00085
00086 void TaskQueue::run( )
00087 {
00088 Task *pTask;
00089
00090 while ( !m_bTermRequested )
00091 {
00092
00093
00094
00095
00096 TaskTime ttNow;
00097 gettimeofday( &ttNow, NULL );
00098
00099 if ((pTask = GetNextExpiredTask( ttNow )) != NULL)
00100 {
00101 try
00102 {
00103 pTask->Execute( this );
00104 pTask->Release();
00105 }
00106 catch( ... )
00107 {
00108 cerr << "TaskQueue::run - Call to Execute threw an exception.";
00109 }
00110
00111 }
00112
00113
00114 msleep( 100 );
00115 }
00116
00117 }
00118
00120
00122
00123 void TaskQueue::Clear( )
00124 {
00125 m_mutex.lock();
00126
00127 for ( TaskMap::iterator it = m_mapTasks.begin();
00128 it != m_mapTasks.end();
00129 ++it )
00130 {
00131 if ((*it).second != NULL)
00132 (*it).second->Release();
00133 }
00134
00135 m_mapTasks.clear();
00136
00137 m_mutex.unlock();
00138 }
00139
00141
00143
00144 void TaskQueue::AddTask( long msec, Task *pTask )
00145 {
00146 TaskTime tt;
00147 gettimeofday( &tt, NULL );
00148
00149 AddMicroSecToTaskTime( tt, (msec * 1000) );
00150
00151 AddTask( tt, pTask );
00152 }
00153
00155
00157
00158 void TaskQueue::AddTask( TaskTime ttKey, Task *pTask )
00159 {
00160
00161 if (pTask != NULL)
00162 {
00163 m_mutex.lock();
00164 pTask->AddRef();
00165 m_mapTasks.insert( TaskMap::value_type( ttKey, pTask ));
00166 m_mutex.unlock();
00167 }
00168 }
00169
00171
00173
00174 void TaskQueue::AddTask( Task *pTask )
00175 {
00176
00177 if (pTask != NULL)
00178 {
00179 TaskTime tt;
00180 gettimeofday( &tt, NULL );
00181
00182 AddTask( tt, pTask );
00183 }
00184 }
00185
00187
00189
00190 Task *TaskQueue::GetNextExpiredTask( TaskTime tt, long nWithinMilliSecs )
00191 {
00192 Task *pTask = NULL;
00193
00194 AddMicroSecToTaskTime( tt, nWithinMilliSecs * 1000 );
00195
00196 m_mutex.lock();
00197
00198 TaskMap::iterator it = m_mapTasks.begin();
00199
00200 if (it != m_mapTasks.end())
00201 {
00202 TaskTime ttTask = (*it).first;
00203
00204 if (ttTask < tt)
00205 {
00206
00207
00208 pTask = (*it).second;
00209
00210 m_mapTasks.erase( it );
00211 }
00212 }
00213 m_mutex.unlock();
00214
00215 return pTask;
00216 }