1

私はSDLを使用していますが、可能であれば他のライブラリ(pthread、boost_thread ...)を使用したソリューションを受け入れます。私はクラスを持っています:

class c_image
{
    public:
        bool _flag_thread;
        int  _id;
        void load (void);
    private:
        int thread_func (void*);
}

c_image::load (void)
{
    SDL_Thread* thread_1;
    if (flag_thread)
        thread_1 = SDL_CreateThread (c_image::thread_func, NULL);
    else
        thread_func (NULL);
}

c_image::thread_func (void* data)
{
    _id = 1;
    ....
    return 0;
}

問題は、flag_threadfalse の場合thread_func、通常の関数のように実行され、正常に動作することですflag_threadが、 true の場合、別のスレッドでその呼び出しが必要であり、その方法がわかりません。SDL_CreateThreadエラーを返す行。メソッドのスレッドが必要なのは、内部でそのthread_funcような要素を変更する必要があるためです。そのような要素_idはクラスのメンバーであり、クラスの外部でスレッドを作成すると、にアクセスできません_id

ありがとう。

編集:これは私が今持っている方法であり、それを機能させる方法が見つかりません:

class c_image
{
    public:
        bool _flag_thread;
        int  _id;
        void load (void);
    private:
        static int thread_func_wrapper (void* data);
        int thread_func (void);
}

void c_image::load (void)
{
    SDL_Thread* thread_1;
    if (flag_thread)
        thread_1 = SDL_CreateThread (thread_func_wrapper, NULL, this);
    else
        thread_func();
}

int c_image::thread_func_wrapper (void* data)
{
    c_image* self = static_cast<c_image*>(data);
    return self->thread_func();
}

int c_image::thread_func (void)
{
    printf ("id: %d", _id);
    ....
    return 0;
}

今ではうまく機能しているようです。私はテストを続けます。どうもありがとうございます!

4

1 に答える 1

2

問題は、「C」スタイルのインターフェースであるため、または同様のタイプの関数オブジェクトSDL_CreateThreadを取ることができないことです。std::function代わりに、参照へのポインターをポインターとして受け取る静的関数を作成する必要がありvoid *dataます。

class c_image
{
  ... 
  static void thread_func_wrapper(void *data);

  int thread_func(void);
};


int c_image::thread_func_wrapper(void *data)
{
   c_image* self = static_cast<c_image*>(data);
   return self->thread_func();
}
于 2013-09-03T23:22:53.107 に答える