gpt4 book ai didi

c++ - 像线程一样调用类方法

转载 作者:行者123 更新时间:2023-11-30 04:14:58 27 4
gpt4 key购买 nike

我正在使用 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_thread 为假,它会像普通函数一样执行 thread_func 并且工作正常,但如果 flag_thread 为真,我需要在不同的线程中进行调用,但我不知道如何进行。 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;
}

现在看来效果不错。我会继续做测试。非常感谢!

最佳答案

问题是 SDL_CreateThread 是一个“C”风格的接口(interface),所以它不能采用 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();
}

关于c++ - 像线程一样调用类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18602951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com