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: スレッドへ修正の仕方
クラス内の関数へのポインタを取得したい、ということでしょうかね...
http://www.geocities.jp/ky_webid/cpp/language/034.html
このあたりは参考になるでしょうか?
http://www.geocities.jp/ky_webid/cpp/language/034.html
このあたりは参考になるでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: スレッドへ修正の仕方
ソースコードは必ずインデントしてcodeタグで囲ってくださいね。読みづらいですから。
boost::threadは詳しく無いですが下記のようにメンバ関数をstaticにすれば呼び出せます。
あとクラス自体をthreadとして呼び出す場合は、operator()()がthreadのメインルーチンになります。この場合staticは不要。
fooがメンバ関数をstaticの例で。
foo2がクラスの場合の例です。
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ikea
Re: スレッドへ修正の仕方
>ookamiさん
メンバ関数ポインタについて勉強になりました!ありがとうございます。
>softyaさん
わかりやすい例をあげていただきありがとうございます。
昨日、こちらを参考にしてスレッド化できました。
operator()()など技術的にわからないところがありましたので掘り下げて調べてみます。
//code貼り付けについて指摘ありがとうございます、配慮に欠けておりました。。。
>a5uaさん
回答ありがとうございます。
まだ試していないのですが、私も当初はbindやstatic_castを使ってアプローチしていたので
参考になります。
回答していただいたみなさん改めてありがとうございました。
メンバ関数ポインタについて勉強になりました!ありがとうございます。
>softyaさん
わかりやすい例をあげていただきありがとうございます。
昨日、こちらを参考にしてスレッド化できました。
operator()()など技術的にわからないところがありましたので掘り下げて調べてみます。
//code貼り付けについて指摘ありがとうございます、配慮に欠けておりました。。。
>a5uaさん
回答ありがとうございます。
まだ試していないのですが、私も当初はbindやstatic_castを使ってアプローチしていたので
参考になります。
回答していただいたみなさん改めてありがとうございました。