4

Xcode と C++ を使用して簡単なゲームを作成しています。問題は次のコードです。

#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

どうしたの?

ありがとう!

4

3 に答える 3

8

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

この関数をクラス関数として含めることはできますが、静的であると宣言する必要があります。スレッドの種類ごとに異なるものが必要になる可能性があります (例: draw)。

例えば:

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();
}
于 2012-04-30T20:14:08.433 に答える
1

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

追加するために編集: メンバー関数を呼び出す必要がある場合 (可能性が高い)、そのパラメーターを として解釈するクラス静的関数を作成し、そのGame*上でメンバー関数を呼び出す必要があります。this次に、の最後のパラメーターとして渡しますpthread_create()

于 2012-04-30T20:05:15.287 に答える
1

pthread を使用したスレッドのコンパイルは、オプションを指定することによって行われます-pthread。abc.cpp をコンパイルすると、他のようにコンパイルする必要があり、 pthread_create collect2: ld returned 1 exit status`g++ -pthread abc.cppのようなエラーが発生します。undefined reference topthread オプションを提供するには、同様の方法が必要です。

于 2012-04-30T19:27:42.090 に答える