2013-05-15 23 views
2

我想问如何使用非void函数作为函数与线程一起运行。如何使用线程启动非void函数

我的意思是,这样的功能,因为这:

void example(Mat& in, Mat& out) 

我怎么可以使用此功能与beginthreadx线程?

,我已经在多线程代码trasform的代码粘贴:

#include <opencv\cv.h> 
#include <opencv\highgui.h> 
#include <stdio.h> 
#include <windows.h> 
#include <process.h> 

using namespace std; 
using namespace cv; 

//filling array 
void acquisisci (Mat in[]){ 
in[0]=imread("C:/OPENCV/Test/imgtest/bird1.jpg",1); 
in[1]=imread("C:/OPENCV/Test/imgtest/bird2.jpg",1); 
in[2]=imread("C:/OPENCV/Test/imgtest/bird3.jpg",1); 
in[3]=imread("C:/OPENCV/Test/imgtest/pig1.jpg",1); 
in[4]=imread("C:/OPENCV/Test/imgtest/pig2.jpg",1); 
in[5]=imread("C:/OPENCV/Test/imgtest/pig3.jpg",1); 
    } 

//grey function 
void elabora (Mat& in, Mat& out){ 
    if (in.channels()==3){ 
     cvtColor(in,out,CV_BGR2GRAY); //passa al grigio 
     } 
    } 
    //threshold function 
    void sogliata(Mat& in, Mat& out){ 
threshold(in,out,128,255,THRESH_BINARY);//fa la soglia 
} 

//view 
    void view (Mat& o){ 
imshow("Immagine",o); 
    waitKey(600); 
    } 

    int main(){ 

Mat in[6],ou[6],out[6]; 

acquisisci(in); 

for (int i=0;i<=5;i++){ 
elabora(in[i],ou[i]); 
} 

for (int i=0;i<=5;i++){ 
sogliata(ou[i],out[i]); 
} 

for (int i=0;i<=5;i++){ 
view(out[i]); 
} 
    return 0; 

    } 

我能做到这一点与并行线程?

回答

4

_beginthreadex需要线程函数的特定签名。

void(*thread_func)(void *); 

要使用的功能有不同的签名,你通常只需创建一个“咚” - 一个小功能,做什么,但叫你真的想调用的函数:

struct params { 
    Mat &in; 
    Mat &out;   
}; 

void thread_func(void *input) { 
    params *p = (params *)input; 

    example(input->in, input->out); 
} 

你”您可能还需要包含类似Windows Event的信号来指示输出中的数据何时准备就绪 - 您不希望在线程中的函数有机会写入数据之前尝试读取它:

struct params { 
    Mat &in; 
    Mat &out;   
    HANDLE event; 

    params() : event(CreateEvent(NULL, 0, 0, NULL)) {} 
    ~params() { CloseHandle(event); } 
}; 

void thread_func(void *input) { 
    params *p = (params *)input; 

    example(input->in, input->out); 
    SetEvent(input->event); 
} 

然后调用函数开始thread_func,并且当它需要结果时,在事件句柄上执行类似WaitForSingleObjectWaitForMultipleObjects的事件,以便它可以在具有所需数据时继续处理。

+0

很好的解释... clear .. 。我今晚试一试..谢谢!我必须在我的程序中执行多线程... 4函数与openCV参数... – Domenico

4

beginthreadx只能与具有单个void*参数的函数一起使用。如果您需要多个参数,请创建一个包含两个值的结构,然后将结构的指针作为唯一属性传递。例如:

struct Args { 
    Mat& in; 
    Mat& out; 
}; 

void example(void* param) { 
    Args* args = (Args*) param; 
    process(args->in, args->out); 
} 
+0

我会避免使用引用成员创建一个结构体或类,它会导致无关的怪癖,这可能会造成混淆。 –

+0

我同意,我宁愿使用指针。 –

+0

谢谢你的回答和时间..然后,我必须使用什么?这是一个openCV mat参数的函数。 – Domenico

1

如果您使用C++ 11,你可以使用lambda和std::thread:如果你不使用C++ 11

Mat in, out; 
std::thread([&]{ example(in, out); }); 

,那么请忽略这个答案。