Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

Thread.h

Go to the documentation of this file.
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 //------------------------------------------------------------------------------

Generated on Wed Mar 16 10:29:38 2005 for Lamp by doxygen 1.3.2