ページ 11

クラスメソッドの並列処理について

Posted: 2009年9月20日(日) 12:48
by nayo
こんにちは、お久しぶりです
今回は麻雀ゲームを作成しているのですがちょっと困った壁にぶつかってしまいました

CPの思考は並列処理にしたいと考えているのですがエラーが出てしまいました
プログラムは大雑把にこんな感じです
class CPlayer
{
protected:
	DWORD  m_thID;
	HANDLE m_hTh;
	unsigned __stdcall cpRoutine(void *);
public:
	void tumo();
};
スレッドの呼び出しはtumoメソッドでCPの場合

m_hTh = (HANDLE)_beginthreadex( NULL, 0, CPlayer::cpRoutine, NULL, 0, (unsigned *)&m_thID );

といった感じで呼び出そうとしています

エラーの内容は

error C3867: 'CPlayer::cpRoutine': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CPlayer::cpRoutine' を使用してください

といったものです
そこでエラーのメッセージ通り&CPlayer::cpRoutineに変更すると

error C2664: '_beginthreadex' : 3 番目の引数を 'unsigned int (__stdcall CPlayer::* )(void *)' から 'unsigned int (__stdcall *)(void *)' に変換できません。(新しい機能 ; ヘルプを参照)

といったエラーメッセージが出てきます

そもそもクラスメソッドを並列処理することはできないのでしょうか
せっかくの休みですがどなたか回答お願いします

書き忘れていましたが環境はVisual C++ 2008 Express Editionです

Re:クラスメソッドの並列処理について

Posted: 2009年9月20日(日) 20:50
by Justy

>そもそもクラスメソッドを並列処理することはできないのでしょうか

 直接 beginthreadexで非staticなメンバ関数を指定することは出来ません。

 下記のページを参考にしてみて下さい。

staticでないクラスメンバ関数を_beginthreadで実行させる方法。 - かせいさんとこ
ttp://d.hatena.ne.jp/kasei_san/20070612/p1

Re:クラスメソッドの並列処理について

Posted: 2009年9月20日(日) 21:31
by nayo
Justyさんありがとうございます
なるほど非スタティックなメンバ関数を指定することはできなかったのですね
staticにすることで解決できました
紹介していただいたページも非常に参考になりました
また質問したときは宜しくお願いします