.NET C++ から VC++ でつくった DLL を参照しようとすると LNK4210警告 がガンガン出る。動きはするので気にしなくて良いのか。とても気持ち悪い。
ところで、スレッドのコールバックというのはスタティック関数でないとダメなのよね。
class clsSample
{
public:
int iData;
private:
static void ThreadProc();
};
この場合、ThreadProc()メソッドの中から、iDataは直接見えない。でも、スレッドに渡す関数はスタティックでないとダメ。
マルチスレッドを初めてプログラムするとき、みんなここ「何で?」って思うんじゃないのかなぁ。まあC++にしろ他の言語にしろ処理系がそういう実装になってる、それが標準的ということになってるからなんでしょうけど。
これ、.NET ではデリゲートなるものを使う。 delegate と書きます。
__delegate void Func();
と宣言してやって、
Func *fnc= new Func(this, clsSample::ThreadProc);
としてしまえば、ThreadProcはスタティックにしなくて良い。で、このfncは、そのままスレッドのコールバックとして渡せる。
Thread *thd = new Thread(fnc);
こうして何となく使い方を覚えてしまうともっといいように使えないものかと欲が出てくる。2次元配列にして状態遷移のマトリクスに使えないかなとか。で、今日は一日そればっかりやってました。まあ結局無理だったんですが。ガベージコレクションではダブルポインタとか使えない罠。
備忘として書き残す。
コメント
あ。正しくは、
System::Threading::ThreadStart()
という関数でデリゲートが返されるので、
スレッドにはそれを渡すのが正解。