2012-04-30 24 views
3

私はXcodeとC++を使って簡単なゲームを作っています。 問題は、次のコードです:'pthread_create'に一致する関数呼び出しがありません

#include <pthread.h> 

void *draw(void *pt) { 
    // ... 
} 

void *input(void *pt) { 
    // .... 
} 

void Game::create_threads(void) { 
    pthread_t draw_t, input_t; 
    pthread_create(&draw_t, NULL, &Game::draw, NULL); // Error 
    pthread_create(&input_t, NULL, &Game::draw, NULL); // Error 
    // ... 
} 

しかし、Xcodeは私にエラーを与える: "No matching function call to 'pthread_create'"。 pthread.hが既に含まれているという理由がありません。

どういうところが間違っていますか?

ありがとうございます!

答えて

6

Kenが述べているように、スレッドコールバックとして渡される関数は(void *)(void *)型の関数でなければなりません。

この関数をクラス関数として含めることはできますが、静的宣言する必要があります。あなたは、潜在的に各スレッドタイプ(例えば、描画)ごとに異なるものを必要とするでしょう。例えば

:私はそれを忘れてしまった

class Game { 
    protected: 
    void draw(void); 
    static void* game_draw_thread_callback(void*); 
}; 

// and in your .cpp file... 

void Game::create_threads(void) { 
    // pass the Game instance as the thread callback's user data 
    pthread_create(&draw_t, NULL, Game::game_draw_thread_callback, this); 
} 

static void* Game::game_draw_thread_callback(void *game_ptr) { 
    // I'm a C programmer, sorry for the C cast. 
    Game * game = (Game*)game_ptr; 

    // run the method that does the actual drawing, 
    // but now, you're in a thread! 
    game->draw(); 
} 
+0

ありがとう、私はCをたくさん使いました。そして、Cでは関数を呼び出すだけで動作します;) – qwertz

1

pthreadを使用したスレッドのコンパイルは、オプション-pthreadを指定して行います。 abc.cppをコンパイルすると、g++ -pthread abc.cppのようにコンパイルする必要があります。の場合、undefined reference to pthread_create collect2:ldが1の終了ステータスを返しました。 pthreadオプションを提供するには、同様の方法が必要です。

+0

申し訳ありません。私は投稿を更新しました。 – qwertz

+0

@ Xcoder場合は、私に教えてください – Invictus

+0

あなたのコードは私にこのエラー(ない "一致する機能..."): "非静的メンバー関数への参照を呼び出す必要があります" – qwertz

1

純関数ポインタが必要なメンバ関数ポインタ(つまり&Game::draw)を渡しています。関数をクラス静的関数にする必要があります。

メンバ関数を呼び出す必要がある場合(おそらく)、そのパラメータをGame*として解釈し、そのメンバ関数を呼び出すクラス静的関数を作成する必要があります。次に、pthread_create()の最後のパラメータとしてthisを渡します。

関連する問題