2011-12-14 24 views
0

このページの最後のコードhttp://www.tuxtips.org/?p=5を使用してクラスメンバーにスレッドを追加できました。引数を持つクラスのpthreadメンバ関数

void* atom(void *instのようなメソッドをカプセル化するコードをどのように拡張するかわかりません。*instは、さまざまなスレッドパラメータを含む構造体です。具体的には、Netbeansも私はexample::*fがどこに定義されているのか、それがthread_makerスコープでどのように有効になるのかを理解していません。

答えて

1

pthread(コールバックをとる)のようなものを使うより良い解決法は、ラッパー関数を作成してboost :: functionsをもっと簡単に操作できるようにすることだと思います。これはUsing boost::bind() across C code, will it work?に似ています。

は、その後、あなたはブーストで単にあなたの問題を解決することができ::バインド

class myClass 
{ 
    void atom(myStruct *data); // void return type to keep it similar to other code 
    // You could change it to a void* return type, but then you would need to change the boost::function declarations 
}; 

boost::function<void(void)> function = boost::bind(&myClass::atom,&myClassInstance,&myStructInstance); //bind your function 
boost::function<void(void)>* functionCopy = new boost::function<void(void)> (function); //create a copy on the heap 

pthread_t id; 
pthread_create(&id,NULL,&functionWrapper,functionCopy); 

ラッパー関数は次のようになります。

void functionWrapper(void* data) 
{ 

    boost::function<void(void)> *func = (boost::function<void(void)>*) (data); 
    (*func)(); 
    delete(func); 
} 

この方法は、手動でデータを渡すよりも仕事かもしれないが、それが何かを結合して、あなたのスレッドを開始するためにそれを渡しすることが容易になり、はるかに拡張可能です。

EDIT

最後の一つのノート:myClassInstanceとmyStructInstanceは、ヒープ上になければなりません。それらがスタック上にある場合、スレッドが開始する前に削除される可能性があります。

+0

私はfunctionCopyでパラメータを渡す方法を理解するための関数ポインタについて十分に知りませんか? functionCopyに構造体を明示的に渡す行を追加することは可能ですか? – Mikhail

+0

@Misha関数コピーの作成の上の行を見るとboost :: bindであり、これはメンバ関数、構造体、データを単一のboost ::関数に変えます。 boost :: bindの基本的な考え方は、 'void blah(int a)'のようなものを 'void blah()'に変えてしまうことです。メンバ関数は、正規の自由関数であるかのように扱われ、最初のパラメータはメンバであるオブジェクトへのポインタです。例えば'myClass :: atom(myStruct * data)' = 'anonFunc(myClass * this、myStruct * data)' – Lalaland

+0

@Misha boost :: functionsを使うことは、関数ポインタとはまったく異なっています。関数ポインタは、どの状態も保持することができません(関数のアドレス用のスペースのみ)。 Boost ::関数はたくさんの状態を保持できます。 – Lalaland

関連する問題