我启动一个后台线程来运行我的类函数,该任务作为无限循环执行,直到客户端决定停止为止。因此,由于在创建pthread时将类对象“ this”传递到线程中,因此我尝试将其强制转换为类对象但得到一个空对象,有人可以向我解释为什么这不可行吗?
void Camera::init()
{
typedef void *(*ThreadFuncPtr)(void *);
this->quit=false;
pthread_create(&acq, NULL, (ThreadFuncPtr)(&Camera::_acquireImages), this);
}
void Camera::stopAcquire()
{
this->quit=true;
}
void Camera::_acquireImages(void* ptr)
{
auto obj = (Camera*) ptr; //obj after cast shows as NULL object
while(!obj->quit){
//do something
}
pthread_exit(NULL);
}
答案 0 :(得分:4)
因此,由于在创建pthread时将类对象“ this”传递到 线程
pthread_create
是C
函数,并且期望函数签名为void* (*)(void*)
,但是现在它具有签名void (Camera::*)(void*)
,因此存在两个错误:函数应返回{ {1}},它也是非静态的类成员。要对其进行修复,请使函数返回void*
并使其void*
:
static
如果您使用的是C ++ 11(或更高版本),则应查看使生活更加轻松的标准void Camera::init()
{
this->quit = false;
// now that the function has the correct signature, you don't need
// to cast it (into something that it wasn't)
pthread_create(&acq, NULL, &Camera::acquireImages, this);
}
void Camera::stopAcquire()
{
this->quit = true;
}
/*static*/ void* Camera::acquiredImages(void* ptr) // make it static in the declaration
{
Camera& obj = *static_cast<Camera*>(ptr);
while(obj.quit == false){
//do something
}
return nullptr;
}
。
<thread>