我在使用此代码时遇到了一些麻烦。
void BV4618::InitializeThreads(void){
pthread_t T_FIFO, T_Buffer;
pthread_create( &T_FIFO, NULL, FIFO, NULL);
pthread_create( &T_Buffer, NULL, readKBuffer, NULL);
}
方法FIFO和readKBuffer做这些事情..
void *BV4618::FIFO(void*){
while (isWorking){
if (qsize > 0){
if(params[0] == -1){
ReceiveData();
}else{
SendData(params[0]);
}
//printf("Processing in position %d value %d\n", qsize, params[0]);
ShifterQ();
}else{
usleep(50000);
}
}
return NULL;
}
关键是,从程序上看,一切都运行正常,没有问题。现在,我将使用课程重写所有内容,我遇到了一些问题,如
cannot convert 'BV4618::FIFO' from type 'void* (BV4618::)(void*)' to type 'void* (*)(void*)' BV4618.cpp
构造函数调用名为" InitializeThreads"的方法。启动连续正在侦听该类对象的线程的线程。上述问题的解决方案是什么?
答案 0 :(得分:1)
我不是pthread专家,但问题是当pthread_create()的定义需要一个函数时,你试图给一个成员函数指针:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
然后,pthread将调用正常的" standalone"函数将arg作为参数。
会员功能然而不像#34;独立"功能。没有它的类和随之而来的数据就毫无意义。
我建议创建一个静态包装函数,并使用this
(指向该类的指针)作为参数。然后,wrap会将参数重新设置为BV4618,并调用invoque类的成员函数。
包装器是静态成员函数。静态成员意味着它独立于类数据:
static void* BV4618::my_wrapper (void* arg) {
((BV4618*)arg)->FIFO( );
}
请注意,在现实生活中,当使用单独的类声明(在标题中)和定义(代码实现)时,静态关键字必须仅在声明中提供。
为了实现这一点,你需要稍微重新定义你的FIFO功能,因为它不再期望一个参数:
void *BV4618::FIFO(){
...
}
您的初始化代码如下:
...
pthread_create( &T_FIFO, NULL, my_wrapper, this);
...