ページ 11

スレッドへ修正の仕方

Posted: 2011年3月25日(金) 02:38
by ikea
Main.cc --------
int main(){
Hoge h;
h.func1();
}
Hoge.cc --------
void Hoge::func1(){
foo.func2(); ←func2()をスレッドで起動したい
}
Hoge.hh --------
class Hoge{
private:
Foo foo;
}
Foo.cc ----------
void Foo::func2(){
while(1){/*処理*/}
}
Foo.hh ----------
class Foo{
public:
void func2();
}

こういう時はどう修正すればよいか教えてもらえないでしょうか
boost::thread th(foo.func2);とかすると
error:no matching function for ~ <unresolved overloaded function type>
でコンパイルが通らず解決できないのです。

Re: スレッドへ修正の仕方

Posted: 2011年3月25日(金) 12:35
by ookami
クラス内の関数へのポインタを取得したい、ということでしょうかね...
http://www.geocities.jp/ky_webid/cpp/language/034.html
このあたりは参考になるでしょうか?

Re: スレッドへ修正の仕方

Posted: 2011年3月25日(金) 12:48
by softya(ソフト屋)
ソースコードは必ずインデントしてcodeタグで囲ってくださいね。読みづらいですから。
boost::threadは詳しく無いですが下記のようにメンバ関数をstaticにすれば呼び出せます。
あとクラス自体をthreadとして呼び出す場合は、operator()()がthreadのメインルーチンになります。この場合staticは不要。
fooがメンバ関数をstaticの例で。
foo2がクラスの場合の例です。

コード:

#include <iostream>
#include <boost/thread.hpp>
using namespace std;
using namespace boost;


//Foo.hh ----------
class Foo{
public:
	static void func2();
};

//Foo.cc ----------
void Foo::func2(){
	for( int i=0 ; i<1000 ; i++ ) {
		cout << i << " ";
	}
}

//Foo2.hh ----------
class Foo2{
public:
	void operator()();
};

//Foo2.cc ----------
void Foo2::operator()(){
	for( int i=1000 ; i<2000 ; i++ ) {
		cout << i << " ";
	}
}

//Hoge.hh --------
class Hoge{
private:
	Foo foo;
	Foo2 foo2;
public:
	void func1();
};

//Hoge.cc --------
void Hoge::func1(){
	boost::thread th(&foo.func2);
	th.join(); // 終了待ち
	boost::thread th2(foo2);
	th2.join(); // 終了待ち
}

//Main.cc --------
int main(){
	Hoge h;
	h.func1();
}

Re: スレッドへ修正の仕方

Posted: 2011年3月25日(金) 17:37
by a5ua
以下のコードはどうでしょうか?

コード:

#include <boost/thread.hpp>
#include <boost/bind.hpp>

class Foo
{
public:
	void func() {/* 省略 */}
};

int main()
{
	Foo foo;
	boost::thread t(boost::bind(&Foo::func, &foo));	// foo.func()が別スレッドで呼ばれる
	t.join();
}

Re: スレッドへ修正の仕方

Posted: 2011年3月26日(土) 13:11
by ikea
>ookamiさん
メンバ関数ポインタについて勉強になりました!ありがとうございます。

>softyaさん
わかりやすい例をあげていただきありがとうございます。
昨日、こちらを参考にしてスレッド化できました。
operator()()など技術的にわからないところがありましたので掘り下げて調べてみます。
//code貼り付けについて指摘ありがとうございます、配慮に欠けておりました。。。

>a5uaさん
回答ありがとうございます。
まだ試していないのですが、私も当初はbindやstatic_castを使ってアプローチしていたので
参考になります。

回答していただいたみなさん改めてありがとうございました。