スレッドへ修正の仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ikea

スレッドへ修正の仕方

#1

投稿記事 by ikea » 14年前

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>
でコンパイルが通らず解決できないのです。

アバター
ookami
記事: 214
登録日時: 15年前
住所: 東京都

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

#2

投稿記事 by ookami » 14年前

クラス内の関数へのポインタを取得したい、ということでしょうかね...
http://www.geocities.jp/ky_webid/cpp/language/034.html
このあたりは参考になるでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 14年前

ソースコードは必ずインデントして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();
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
a5ua
記事: 199
登録日時: 15年前

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

#4

投稿記事 by a5ua » 14年前

以下のコードはどうでしょうか?

コード:

#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();
}

ikea

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

#5

投稿記事 by ikea » 14年前

>ookamiさん
メンバ関数ポインタについて勉強になりました!ありがとうございます。

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る