C++ 将结构传递给线程,如何访问结构中的多个数据?

C++ 将结构传递给线程,如何访问结构中的多个数据?,c++,opencv,C++,Opencv,我有个问题。我需要使用OpenCV Mat图像的结构将多个参数传递给线程 我有一个这样的结构: struct Args { Mat in[6]; Mat out[6]; }; void grey (void *param){ while (TRUE) { WaitForSingleObject(mutex,INFINITE); Args* arg = (Args*)param; cvtColor(*arg->in,*arg->

我有个问题。我需要使用OpenCV Mat图像的结构将多个参数传递给线程

我有一个这样的结构:

struct Args
{
    Mat in[6];
    Mat out[6];
};
void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}
Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
*dati.in = *inn;
*dati.out = *ou;
还有一个由线程调用的void函数,如下所示:

struct Args
{
    Mat in[6];
    Mat out[6];
};
void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}
Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
*dati.in = *inn;
*dati.out = *ou;
对于使用两个Mat数组参数作为线程启动灰色函数,我在main中使用以下行:

Args dati;
    *dati.in = *inn;
    *dati.out = *ou;


handle1 = (HANDLE) _beginthread(grey,0,&dati);
现在,我的问题是:我需要访问从线程本身传递给线程的结构中两个数组“in”和“out”的所有6个元素,或者,找到一种模式将数组从0移动到5,以使用“grey”函数详细说明所有元素

如何从线程或主线程执行此操作?我的意思是,在[6]的struct Args中,使用灰色函数对数组Mat的所有6个元素进行细化,我在该模式下将这些元素传递给线程


有人能帮我或给我一个主意吗?我不知道怎么做。

启动线程时,以下代码:

Args dati;
*dati.in = *inn;
*dati.out = *ou;
Args* arg = (Args*)param;
cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
只是初始化了六个元素中的一个。如果
inn
ou
实际上是6个元素数组,则需要一个循环来初始化所有6个元素

Args dati;
for (int i = 0; i < 6; i++) {
  dati.in[i] = inn[i];
  dati.out[i] = ou[i];
}
需要变成这样:

struct Args
{
    Mat in[6];
    Mat out[6];
};
void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}
Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
*dati.in = *inn;
*dati.out = *ou;
Args*arg=(Args*)参数;
对于(int i=0;i<6;i++){
CVT颜色(arg->in[i],arg->out[0],CV_bgr2灰色);
}

启动线程时,此代码:

Args dati;
*dati.in = *inn;
*dati.out = *ou;
Args* arg = (Args*)param;
cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
只是初始化了六个元素中的一个。如果
inn
ou
实际上是6个元素数组,则需要一个循环来初始化所有6个元素

Args dati;
for (int i = 0; i < 6; i++) {
  dati.in[i] = inn[i];
  dati.out[i] = ou[i];
}
需要变成这样:

struct Args
{
    Mat in[6];
    Mat out[6];
};
void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}
Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
*dati.in = *inn;
*dati.out = *ou;
Args*arg=(Args*)参数;
对于(int i=0;i<6;i++){
CVT颜色(arg->in[i],arg->out[0],CV_bgr2灰色);
}

在创建线程之前,按如下方式分配数组:

struct Args
{
    Mat in[6];
    Mat out[6];
};
void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}
Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
*dati.in = *inn;
*dati.out = *ou;
这将只分配数组中的第一个条目。阵列的其余部分将保持不变

您需要将所有源阵列复制到目标阵列中。您可以为此使用:

std::copy(std::begin(dati.in), std::end(dati.in), std::begin(inn));
当然,这要求源“array”
inn
至少包含与目标数组相同数量的项

然后在线程中,只需在项目上循环:

for (int i = 0; i < 6; i++)
{
    cvtColor(arg->in[i], arg->out[i], CV_BGR2GRAY);
}
for(int i=0;i<6;i++)
{
CVT颜色(arg->in[i],arg->out[i],CV\u bgr2灰色);
}

在创建线程之前,按如下方式分配数组:

struct Args
{
    Mat in[6];
    Mat out[6];
};
void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}
Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}
*dati.in = *inn;
*dati.out = *ou;
这将只分配数组中的第一个条目。阵列的其余部分将保持不变

您需要将所有源阵列复制到目标阵列中。您可以为此使用:

std::copy(std::begin(dati.in), std::end(dati.in), std::begin(inn));
当然,这要求源“array”
inn
至少包含与目标数组相同数量的项

然后在线程中,只需在项目上循环:

for (int i = 0; i < 6; i++)
{
    cvtColor(arg->in[i], arg->out[i], CV_BGR2GRAY);
}
for(int i=0;i<6;i++)
{
CVT颜色(arg->in[i],arg->out[i],CV\u bgr2灰色);
}

你的问题不是很清楚。。如果你的意思是你想把变量值传递给线程,而它已经被创建了,你可以考虑使用“队列”……你的线程已经在结构中的数组中有六个条目,但是你只是设置和访问第一个条目。如果你想复制线程中的数组,那么你的洗牌不会改变结构中的数组,那么就在线程函数和中创建新数组。另外,当你释放互斥锁后退出线程时,为什么要在线程函数中创建循环?确切地说。。。如何在一个线程中处理所有六张图片?我能做吗?或者我必须为每个单独的图像创建一个线程吗?如何创建队列?我为这个问题道歉,但直到最近我才不得不处理线程…循环它们<代码>对于(inti=0;i<6;i++){/*使用arg->in[i]*/}?当然,这需要您在将数组传递给数组之前正确设置数组,而您现在没有这样做。您的问题不是很清楚。。如果你的意思是你想把变量值传递给线程,而它已经被创建了,你可以考虑使用“队列”……你的线程已经在结构中的数组中有六个条目,但是你只是设置和访问第一个条目。如果你想复制线程中的数组,那么你的洗牌不会改变结构中的数组,那么就在线程函数和中创建新数组。另外,当你释放互斥锁后退出线程时,为什么要在线程函数中创建循环?确切地说。。。如何在一个线程中处理所有六张图片?我能做吗?或者我必须为每个单独的图像创建一个线程吗?如何创建队列?我为这个问题道歉,但直到最近我才不得不处理线程…循环它们<代码>对于(inti=0;i<6;i++){/*使用arg->in[i]*/}?当然,这需要你在数组之前把数组正确地设置,这是你现在不做的。修改,不工作…VisualC++不编译…为什么???(假设
inn
ou
是源数组的实际名称,那么我在第一个循环中将
ou
变量误输入为
out
。我已经更新了我的答案。如果这不是问题,你需要提供这些变量的完整定义。我只是猜测它们是如何定义的。我发布了完整的代码为了让你明白。我把它当作一个答案贴出来,好吗?提前感谢你的耐心。你删除了
Args*arg=(Args*)当你使用循环复制元素时,你不需要做<代码> STD::复制< /代码>。任何方法都应该工作。选择你喜欢的任何一种。虽然你想使用<代码> STD::拷贝< /代码>我想你需要添加另一个包含。这个修改,不工作…Visual C++做的。不编译…为什么?(假设
inn
ou
是源数组的实际名称,那么我在第一个循环中将
ou
变量错误地键入为
out
。我已经更新了答案。如果这不是问题,您需要为