gpt4 book ai didi

c++ - 无法在 pthread_create 函数中将 '*void(MyClass::*)(void*) 转换为 void*(*)(void*)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:27 29 4
gpt4 key购买 nike

我正在尝试使用“CameraManager”类创建一个新线程,但出现以下错误:

cannot convert '*void(CameraManager:: * )(void*) to void*( * )(void*) in pthread_create function

我在cameramanager.h文件中定义:

public:
void *dequeueLoop(void *ptr);

在 cameramanager.cpp 中

void CameraManager::startDequeuing(){
dequeuing = true;
dequeueThreadId = pthread_create(&dequeueThread, NULL, &CameraManager::dequeueLoop, NULL);
}

void *CameraManager::dequeueLoop(void *ptr){
while(dequeuing){
highSpeedCamera->dequeue();
highSpeedCamera->enqueue();
}

我不想将 dequeueLoop 声明为静态函数我还尝试通过以下方式将 dequeueLoop 声明为类友元函数但是它没有类变量“highSpeedCamera”和“dequeuing”的范围编译器还告诉我“dequeueLoop”没有在此范围内声明

为了使 dequeueLoop 成为我所做的友元函数:

摄影机管理器.h

public:
friend void *dequeueLoop(void *ptr);

相机管理器.cpp

void CameraManager::startDequeuing(){
dequeuing = true;
dequeueThreadId = pthread_create(&dequeueThread, NULL, &CameraManager::dequeueLoop, NULL);
}
void *dequeueLoop(void *ptr){
while(dequeuing){
highSpeedCamera->dequeue();
highSpeedCamera->enqueue();
}
}

我哪里做错了?

最佳答案

I don't want to declare dequeueLoop as a static function

如果您想使用 pthreads,那么您需要一个静态或非成员函数作为入口点。您可以将指向您的对象的指针传递给此函数,将其用作非静态成员函数的蹦床:

static void * dequeueEntry(void * self) {
return static_cast<CameraManager*>(self)->dequeueLoop();
}

dequeueThreadId = pthread_create(
&dequeueThread, NULL,
&CameraManager::dequeueEntry, // <-- pointer to trampoline function
this); // <-- pointer to object for member function

或者,如果您有现代编译器,则可以改用标准线程库:

std::thread thread(&CameraManager::dequeLoop, this);

关于c++ - 无法在 pthread_create 函数中将 '*void(MyClass::*)(void*) 转换为 void*(*)(void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12006097/

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