2011-06-19 9 views
2
から

のメソッドを実行しています。一度作成したソートのアクティブオブジェクトを設計しようとしています。私がこれまで行ってきたことは、pthreadインスタンス変数を含むクラスを作成し、そのクラスのコンストラクタで、pthreadを途中で送るべきです。Pthreadインスタンスの変数は、クラス

pthread_create()は関数のパラメータを取るので、クラス実装ファイルでrun()関数を設定します。今のよう

、私の実行()関数は、それだけで実装ファイルに座って、クラスの一部ではありませんが、私はそれをコンパイルしようとしたとき、私はというエラーを取得:

"error: ‘run’ was not declared in this scope" 

ここでは、関数run()が範囲外である理由を理解していますが、run()をプライベート関数としてアクティブオブジェクトクラスに追加するのは正しいでしょうか、またはこれらのオブジェクトが複数存在する場合、 ?ちょっと、それらのうちの1つだけをインスタンス化して問題を引き起こすでしょうか?

ここにコードがありますが、私はちょうどそれが重要だとは思わなかった。ここで、MyClass.cpp

class MyClass { 

private: 
pthread_t thread; 

    ObjectManager *queue; 
int error; 

    // just added this, but the compiler still doesn't like it 
    void *run(void *arg); 

public: 

    MyClass(); 
    ~MyClass(); 

void start(); 
} 

MyClass.hpp

であり、ここで実装したものです:

#include "MyClass.hpp" 

void MyClass::start() { 
if (queue == NULL) 
    return; 

int status = pthread_create(&thread, NULL, run, (void *) queue); 
if (status != 0) { 
    error = status; 
    return; 
} 

} 


void *MyClass::run(void *arg) { 
bool finished = false; 
while (!finished) { 
     // blah blah blah 
} 
return NULL; 
} 
+0

コードを表示するか、ヘルプを提供するのが非常に難しいでしょう – nos

+0

OK、クラス関数として追加しようとしましたが、型の不一致のためにコンパイルされません。 void *(*)(void *)を探していて、void *(MyClass ::)(void *)を取得しています。 –

+0

[pthread Function from a Class]の複製が可能です。(http://stackoverflow.com/questions/1151582/pthreadfunction-from-a-class) –

答えて

2

あなたのコンパイルの問題がrunは、あなたがそれを参照た後、あなたの実装ファイルで定義されている可能性がある、あなたのコンストラクタ。コンストラクターの前にrunの定義を移動するか、コンストラクターの前にrunの宣言を挿入します。

あなたの問題としては、メンバー以外の機能をお探しの場合はpthread_createとして動作しないクラスメンバーにしてください。あなたはそれをクラスの静的メソッドにすることもできますが、それを安全に行うかどうかを決める前に、In C++, is it safe/portable to use static member function pointer for C API callbacks?を読んでください(元の関数の使い方を知っている必要はありません)。

+0

十分に簡単に、ありがとうございます。なぜ私はそれを逃したが、あなたに感謝しないでください。 –

+1

これは何度も尋ねられました。常に静的メンバー関数が現れますが、まだ**常に間違っています**。 –

+0

Read:http://stackoverflow.com/q/6352280/14065 –