00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Fennel_Thread_Included
00025 #define Fennel_Thread_Included
00026
00027 #include "fennel/synch/SynchObj.h"
00028 #include <boost/utility.hpp>
00029
00030 namespace boost
00031 {
00032 class thread;
00033 };
00034
00035 FENNEL_BEGIN_NAMESPACE
00036
00041 class FENNEL_SYNCH_EXPORT Thread : public boost::noncopyable
00042 {
00043 protected:
00044 boost::thread *pBoostThread;
00045 bool bRunning;
00046 std::string name;
00047
00048 void initAndRun();
00049 virtual void run() = 0;
00050 virtual void beforeRun();
00051 virtual void afterRun();
00052
00053 public:
00054 explicit Thread(std::string const &description = "anonymous thread");
00055 virtual ~Thread();
00056
00060 virtual void start();
00061
00065 void join();
00066
00071 bool isStarted() const
00072 {
00073 return pBoostThread ? true : false;
00074 }
00075
00079 bool isStopped() const
00080 {
00081 return !isStarted();
00082 }
00083
00090 boost::thread &getBoostThread()
00091 {
00092 assert(isStarted());
00093 return *pBoostThread;
00094 }
00095
00096 std::string getName()
00097 {
00098 return name;
00099 }
00100
00101 void setName(std::string const &s)
00102 {
00103 name = s;
00104 }
00105 };
00106
00107 FENNEL_END_NAMESPACE
00108
00109 #endif
00110
00111