gpt4 book ai didi

c++ - Visual C++ 如何用线程启动非 void 函数

转载 作者:太空狗 更新时间:2023-10-29 19:53:13 24 4
gpt4 key购买 nike

我想问一下如何使用非void函数作为线程运行的函数。

我的意思是,像这样的函数:

void example(Mat& in, Mat& out)

如何通过 beginthreadx 将此函数用于线程?

在多线程代码中粘贴我要转换的代码:

#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;

}

我可以用并行线程来做到这一点吗??

最佳答案

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

 void(*thread_func)(void *);

要使用具有不同签名的函数,您通常只需创建一个“thunk”——一个除了调用您真正想要调用的函数之外什么都不做的小函数:

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 的操作, 因此它可以在拥有所需数据时继续处理。

关于c++ - Visual C++ 如何用线程启动非 void 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570154/

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