CThreadによるスレッドの生成




yaneSDK3rdでは、スレッドはCThreadというクラスがあります。スレッドの生成〜解体には、必ずこのクラスを用います。

このCThreadを用いてスレッドを用意するには、大きくわけて3つの方法があります。

1つ目の方法.

枠-1
    virtual void ThreadProc() {}
    /**
        ワーカースレッドの処理を記述するために、
        この関数をオーバーライドします。
        (このクラスを派生させて使うとき)
    */


このクラスを派生させて、このThreadProceをオーバーライドする方法。
あとは、CThread::CreateThreadを呼び出せば、ThreadProcが別スレッドで起動します。

2つ目の方法.

CThreadのメンバで

枠-2
    virtual LRESULT CreateThread(const smart_ptr<function_callback>& fn);

というメソッドがあります。このメソッドには、コールバックをしたい関数を指定できます。このfunction_callbackというのは、メンバ関数コールバック(⇒「天才ゲームプログラマ養成ギプス」参照。また実装の詳細については、「やね本1」をご覧ください)の機能と、通常のグローバルな関数のコールバック機能の両方を兼ね備えたコールバック用のクラスです。要するに、コールバックする関数を指定したいときは、こいつさえ使えば万全というわけです。

3つ目の方法.

CThread::SetThreadFunctionというメンバによって、コールバックする関数を事前に指定することが出来ます。

枠-3
    virtual void SetThreadFunction(const smart_ptr<function_callback>& fn);


そのあと、

枠-4
    virtual LRESULT CreateThread();


を呼び出せば、先に設定されたコールバック関数が呼び出されます。2.の方法をふたつの段階に分割したわけです。

なぜ、3.の方法が必要かというと、CThreadManagerを用いてCThreadManager::CreateThreadによって、スレッドを生成し、その所有権をスレッドマネージャに預けてしまう場合は、CThread::CreateThread(void)が呼び出されます。よって、この場合、2.の方法では不可なのです。事前にコールバックする関数を指定する手段が必要になってくるのです。そこで、3.の方法を用意しました。