00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "ArExport.h"
00027
00028 #ifndef WIN32
00029 #include <pthread.h>
00030 #include <unistd.h>
00031 #endif
00032 #include "ariaOSDef.h"
00033 #include "ArASyncTask.h"
00034 #include "ArLog.h"
00035 #include "ArRecurrentTask.h"
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 AREXPORT
00047 ArRecurrentTask::ArRecurrentTask()
00048 {
00049 setThreadName("ArRecurrentTask");
00050 running = go_req = killed = false;
00051 create();
00052 }
00053
00054
00055 AREXPORT
00056 ArRecurrentTask::~ArRecurrentTask()
00057 {
00058 kill();
00059 }
00060
00061
00062
00063
00064
00065
00066
00067 AREXPORT void *
00068 ArRecurrentTask::runThread(void *ptr)
00069 {
00070 threadStarted();
00071 #ifndef WIN32
00072 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
00073 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
00074 #endif
00075 while (myRunning)
00076 {
00077 bool doit;
00078
00079 while (myRunning)
00080 {
00081 lock();
00082 doit = go_req;
00083 unlock();
00084 if (doit)
00085 break;
00086
00087 #ifndef WIN32
00088 usleep(10000);
00089 #else
00090 Sleep(10);
00091 #endif
00092 }
00093 if (!myRunning)
00094 break;
00095 lock();
00096 go_req = false;
00097 running = true;
00098 unlock();
00099 task();
00100 lock();
00101 running = false;
00102 unlock();
00103 }
00104 return NULL;
00105 }
00106
00107 AREXPORT void ArRecurrentTask::go()
00108 {
00109 lock();
00110 go_req = true;
00111 running = true;
00112 killed = false;
00113 unlock();
00114 }
00115
00116 AREXPORT int ArRecurrentTask::done()
00117 {
00118 lock();
00119 bool is_running = running;
00120 bool is_killed = killed;
00121 unlock();
00122 if (is_running) return 0;
00123 if (is_killed) return 2;
00124 else return 1;
00125 }
00126
00127 AREXPORT void ArRecurrentTask::reset()
00128 {
00129 lock();
00130 go_req = false;
00131 if (running)
00132 {
00133 killed = true;
00134 running = false;
00135 unlock();
00136 cancel();
00137 create();
00138 }
00139 else
00140 unlock();
00141 }
00142
00143 AREXPORT void ArRecurrentTask::kill()
00144 {
00145 lock();
00146 go_req = false;
00147 killed = true;
00148 running = false;
00149 unlock();
00150 cancel();
00151 }