00001 //------------------------------------------------------------------------------ 00002 // Lamp : Open source game middleware 00003 // Copyright (C) 2004 Junpei Ohtani ( Email : junpee@users.sourceforge.jp ) 00004 // 00005 // This library is free software; you can redistribute it and/or 00006 // modify it under the terms of the GNU Lesser General Public 00007 // License as published by the Free Software Foundation; either 00008 // version 2.1 of the License, or (at your option) any later version. 00009 // 00010 // This library is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 // Lesser General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public 00016 // License along with this library; if not, write to the Free Software 00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 //------------------------------------------------------------------------------ 00019 00020 /** @file 00021 * スレッドヘッダ 00022 * @author Junpee 00023 */ 00024 00025 #ifndef THREAD_H_ 00026 #define THREAD_H_ 00027 00028 #include <Core/Thread/Runnable.h> 00029 00030 namespace Lamp{ 00031 00032 //------------------------------------------------------------------------------ 00033 /** 00034 * スレッド 00035 * 00036 * スレッドはマルチスレッド版のCランタイムライブラリを必要とします。ビルドできない 00037 * 場合はランタイムライブラリの設定がマルチスレッドになっているか確認をしてください。 00038 */ 00039 class Thread : public Runnable{ 00040 friend class LampCore; 00041 public: 00042 /// 優先度 00043 enum Priority{ 00044 /// タイムクリティカル 00045 priorityTimeCritical = THREAD_PRIORITY_TIME_CRITICAL, 00046 /// とても高い 00047 priorityHighest = THREAD_PRIORITY_HIGHEST, 00048 /// 高い 00049 priorityHigh = THREAD_PRIORITY_ABOVE_NORMAL, 00050 /// 通常 00051 priorityNormal = THREAD_PRIORITY_NORMAL, 00052 /// 低い 00053 priorityLow = THREAD_PRIORITY_BELOW_NORMAL, 00054 /// とても低い 00055 priorityLowest = THREAD_PRIORITY_LOWEST, 00056 /// アイドル 00057 priorityIdle = THREAD_PRIORITY_IDLE, 00058 }; 00059 00060 //-------------------------------------------------------------------------- 00061 // 初期化、終了処理 00062 //-------------------------------------------------------------------------- 00063 /** 00064 * コンストラクタ 00065 */ 00066 Thread(); 00067 00068 /** 00069 * コンストラクタ 00070 * @param runnable 実行対象 00071 */ 00072 Thread(Runnable* runnable); 00073 00074 /** 00075 * コンストラクタ 00076 * @param lockObject ロックオブジェクト 00077 * @param deleteLockObject ロックオブジェクトをThreadが削除するならtrue 00078 */ 00079 Thread(LockObject* lockObject, bool deleteLockObject); 00080 00081 /** 00082 * コンストラクタ 00083 * @param runnable 実行対象 00084 * @param lockObject ロックオブジェクト 00085 * @param deleteLockObject ロックオブジェクトをThreadが削除するならtrue 00086 */ 00087 Thread(Runnable* runnable, LockObject* lockObject, bool deleteLockObject); 00088 00089 /** 00090 * デストラクタ 00091 */ 00092 virtual ~Thread(); 00093 00094 //-------------------------------------------------------------------------- 00095 // スレッドの操作 00096 //-------------------------------------------------------------------------- 00097 /** 00098 * スレッドを開始する 00099 */ 00100 virtual void start(); 00101 00102 /** 00103 * スレッドをセットアップする 00104 */ 00105 virtual void setup(); 00106 00107 /** 00108 * 実行 00109 * @param thread 実行しているスレッド 00110 * 00111 * isStopRequested()がtrueを返す場合は速やかに処理を終了させる 00112 */ 00113 virtual void run(Thread* thread){} 00114 00115 /** 00116 * スレッドの終了を依頼する 00117 */ 00118 virtual void requestStop(); 00119 00120 /** 00121 * スレッドの終了を依頼し、終了を待つ 00122 */ 00123 virtual void stop(){ stop(INFINITE); } 00124 00125 /** 00126 * スレッドの終了を依頼し、終了を待つ 00127 * @param milliseconds タイムアウトまでのミリ秒を指定する 00128 * @return 終了していればtrueを返す、falseならタイムアウト 00129 */ 00130 virtual bool stop(u_int milliseconds); 00131 00132 /** 00133 * スレッドの終了を待つ 00134 */ 00135 virtual void join(){ join(INFINITE); } 00136 00137 /** 00138 * スレッドの終了を待つ 00139 * @param milliseconds タイムアウトまでのミリ秒を指定する 00140 * @return 終了していればtrueを返す、falseならタイムアウト 00141 */ 00142 virtual bool join(u_int milliseconds); 00143 00144 //-------------------------------------------------------------------------- 00145 /** 00146 * プライオリティの設定 00147 */ 00148 virtual void setPriority(Priority priority); 00149 00150 /** 00151 * プライオリティの取得 00152 */ 00153 virtual Priority getPriority(); 00154 00155 //-------------------------------------------------------------------------- 00156 /** 00157 * サスペンド 00158 * 00159 * ロックをかけるので自分自身のsuspendは呼べない 00160 */ 00161 virtual void suspend(); 00162 00163 /** 00164 * レジューム 00165 */ 00166 virtual void resume(); 00167 00168 //-------------------------------------------------------------------------- 00169 // メンバアクセサ 00170 //-------------------------------------------------------------------------- 00171 /** 00172 * スレッドハンドルの取得 00173 * @return スレッドハンドル 00174 */ 00175 virtual HANDLE getThreadHandle() const{ return threadHandle_; } 00176 00177 /** 00178 * スレッドIDの取得 00179 * @return スレッドID 00180 */ 00181 virtual u_int getThreadID() const{ return threadID_; } 00182 00183 /** 00184 * スレッドが終了しているか 00185 * @return スレッドが終了していればtrue 00186 */ 00187 virtual bool isFinished() const{ return isFinished_; } 00188 00189 /** 00190 * スタックサイズの取得 00191 * @return スタックサイズ 00192 * 00193 * このメソッドをオーバーライドすることによりスタックサイズを変更できます 00194 */ 00195 virtual u_int getStackSize(){ return 1024 * 1024; } 00196 00197 //-------------------------------------------------------------------------- 00198 // 静的関数 00199 //-------------------------------------------------------------------------- 00200 /** 00201 * カレントスレッドの休止 00202 * @param milliseconds 休止時間をミリ秒で指定する 00203 */ 00204 static void sleep(u_int milliseconds){ ::Sleep(milliseconds); } 00205 00206 /** 00207 * カレントスレッドから制御を譲る 00208 */ 00209 static void yield(){ ::Sleep(0); } 00210 00211 //-------------------------------------------------------------------------- 00212 // 使用不可 00213 //-------------------------------------------------------------------------- 00214 /** 00215 * スレッドの実行ラッパ 00216 * 00217 * このメソッドはシステムから利用されるので決して呼び出さないで下さい 00218 */ 00219 virtual u_int executeWrapper(); 00220 00221 //-------------------------------------------------------------------------- 00222 protected: 00223 /** 00224 * スレッドの作成 00225 */ 00226 virtual void createThread(); 00227 00228 private: 00229 /** 00230 * 初期化 00231 */ 00232 static void initialize(); 00233 00234 /** 00235 * 後始末 00236 */ 00237 static void finalize(); 00238 00239 // 実行対象 00240 Runnable* runnable_; 00241 // スレッドハンドル 00242 HANDLE threadHandle_; 00243 // スレッドID 00244 u_int threadID_; 00245 // スレッドが終了しているか 00246 volatile bool isFinished_; 00247 00248 // 不正なスレッドハンドル 00249 static const HANDLE invalidThreadHandle; 00250 }; 00251 00252 //------------------------------------------------------------------------------ 00253 } // End of namespace Lamp 00254 #endif // End of THREAD_H_ 00255 //------------------------------------------------------------------------------