2012-04-30 157 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

作爲肯指出,作爲線程回調傳遞的函數必須是(無效*)(*)(無效*)類型的功能。

您仍然可以將此函數作爲類函數加入,但它必須聲明爲靜態函數。您可能需要爲每個線程類型(例如繪製)使用不同的線程。

例如:

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完成。 如編譯abc.cpp將要求您編譯像g++ -pthread abc.cpp人會 給你喜歡undefined reference to在pthread_create collect2錯誤:LD返回1個退出status`。必須有一些類似的方法來提供pthread選項。

+0

對不起,我忘了。我已更新該帖子。 – qwertz

+0

@Xcoder讓我知道,如果它不工作 – Invictus

+0

你的代碼給了我這個錯誤(不是「沒有匹配的功能...」):「引用非靜態成員函數必須叫」 – qwertz

1

你傳遞其中需要純函數指針一個成員函數指針(即&Game::draw)。你需要使這個函數成爲一個類的靜態函數。

編輯添加:如果您需要調用成員函數(很可能),您需要創建一個類的靜態函數,將其參數解釋爲Game*,然後在其上調用成員函數。然後,通過this作爲pthread_create()的最後一個參數。