我有一个c ++类,如下所示。我试图在下面设置一个线程,其中我的回调(void指针函数)在类中。这会在pthread_create函数上引发错误,表示
无法从void *(Ball ::)(void *)类型转换为void *()(void )
class Ball
{
private: struct BallMsg ballMsg;
private: pthread_t ballThread;
public: Ball(int id)
{
ballMsg.id = id;
ballMsg.r = 7;
ballMsg.x = 60 + (455/2) - 30;
ballMsg.y = 60 + 10 + 5 + ballMsg.r;
ballMsg.c = 0xFFFF0000;
ballMsg.vel = 5.0;
ballMsg.ang = 45.0;
int ret;
ret = pthread_create(&ballThread, NULL, this->ball_thread, NULL);
if (ret !=0)
{
xil_printf("Error launching thread 1\r\n");
}
}
public: void *ball_thread(void *arg)
{
int i = 0;
while(1)
{
//unsigned int tval = sys_time(NULL);
//xil_printf("%d : Time is: %d\r\n", i++, tval);
}
}
public: ~Ball()
{
}
};
答案 0 :(得分:3)
pthread_create
需要指向非成员函数的指针,但void *ball_thread
是Ball
的成员。这意味着它需要一个Ball
对象被调用,因此与非成员有一个根本不同的结构。
您可以使用std::thread
代替,这样可以轻松地将对象绑定到成员函数。
或者,您可以ball_thread
为非会员提供服务,并在必要时传递Ball*
第一个参数。