pthread for processes with more than one parameter
我目前正在创建一个使用线程处理 BMP 图像的程序。问题是......我知道 pthread 使用函数的签名作为 arg 4......但是如果函数需要超过 1 个参数,我怎么能创建一个线程呢?
这是函数所需的结构:
1 2 3 4 5 6 7 | typedef struct { HEADER header; INFOHEADER infoheader; PIXEL *pixel; } IMAGE; IMAGE imagenfte,imagendst; |
功能代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | void *processBMP(IMAGE *imagefte, IMAGE *imagedst) { int i,j; int count=0; PIXEL *pfte,*pdst; PIXEL *v0,*v1,*v2,*v3,*v4,*v5,*v6,*v7; int imageRows,imageCols; memcpy(imagedst,imagefte,sizeof(IMAGE)-sizeof(PIXEL *)); imageRows = imagefte->infoheader.rows; imageCols = imagefte->infoheader.cols; imagedst->pixel=(PIXEL *)malloc(sizeof(PIXEL)*imageRows*imageCols); for(i=1;i<imageRows-1;i++){ for(j=1;j<imageCols-1;j++) { pfte=imagefte->pixel+imageCols*i+j; v0=pfte-imageCols-1; v1=pfte-imageCols; v2=pfte-imageCols+1; v3=pfte-1; v4=pfte+1; v5=pfte+imageCols-1; v6=pfte+imageCols; v7=pfte+imageCols+1; pdst=imagedst->pixel+imageCols*i+j; ... } ... int main() { int res; ///////Variables a utilizar en Hilo/////// int procBMP_t; //Variable entera para la creaci?3n de los hilos pthread_t proc_t; //Hilo para el procesamiento del BMP ////////////////////////////////////////// ... procBMP_t = pthread_create(&proc_t, NULL, processBMP, (void *) &imgsSENT); //Hilo para el procesamiento de imagenes |
我试着用这个来解决它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | struct threadImgs{ //Estructura para enviar ambas imagenes como argumento del thread IMAGE fuente; IMAGE destino; }; struct threadImgs imgsSENT; void *processBMP(void *imgs) { struct threadImgs* imagen = (struct threadImgs *) imgs; IMAGE *imagefte = imagen->fuente; IMAGE *imagedst = imagen->destino; .... } |
但它并没有真正的帮助,甚至无法编译由于"初始化类型结构错误时不兼容的类型"
任何帮助 D:???
您将两个参数package到一个结构中的方法是要走的路。
但请注意类型:
1 2 3 4 5 | struct threadImgs { IMAGE fuente; IMAGE destino; }; |
上面的结构定义它的元素是
的实例
您的线程函数尝试访问指向
的指针
1 2 3 4 5 6 7 8 | void *processBMP(void *imgs) { struct threadImgs* imagen = (struct threadImgs *) imgs; IMAGE *imagefte = imagen->fuente; IMAGE *imagedst = imagen->destino; ... |
所以要么改变结构体将其元素定义为指针:
1 2 3 4 5 | struct threadImgs { IMAGE * fuente; IMAGE * destino; }; |
或者改变线程函数不拉指针:
1 2 3 4 5 6 7 8 | void *processBMP(void *imgs) { struct threadImgs * imagen = (struct threadImgs *) imgs; IMAGE imagefte = imagen->fuente; IMAGE imagedst = imagen->destino; ... |