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

时间:2013-05-29 08:21:30

标签: c++ opencv

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

我有这样的结构:

struct Args
{
    Mat in[6];
    Mat out[6];
};

由线程调用的void函数,如下所示:

void grey (void *param){
    while (TRUE)
    {
    WaitForSingleObject(mutex,INFINITE);
    Args* arg = (Args*)param;
    cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);
    ReleaseMutex(mutex);
    _endthread();
    }
}

为了启动灰色函数作为带有两个Mat数组参数的线程,我使用main中的跟随行:

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


handle1 = (HANDLE) _beginthread(grey,0,&dati);

现在,我的问题是:我需要访问从线程本身传递给线程的struct中的两个数组“in”和“out”的所有6个元素,但是,找到一个模式将数组从0移位到5来详细说明具有“灰色”功能的所有元素。

我怎么能从线程或主要做到这一点?我的意思是使用灰色函数来详细说明我在这种模式下传递给线程的结构Args的[6]中的数组Mat的所有6个元素。

有人可以帮助我或给我一个想法吗?我不知道怎么做。

2 个答案:

答案 0 :(得分:2)

在创建线程之前,您可以像这样分配数组:

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

这只会在数组中指定第一个条目。阵列的其余部分将不受影响。

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

std::copy(std::begin(dati.in), std::end(dati.in), std::begin(inn));

当然,这需要源“数组”inn包含至少与目标数组一样多的项目。

然后在线程中简单地循环遍历项目:

for (int i = 0; i < 6; i++)
{
    cvtColor(arg->in[i], arg->out[i], CV_BGR2GRAY);
}

答案 1 :(得分:1)

启动线程时,此代码:

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

只是初始化六个元素中的一个。如果innou实际上是6个元素数组,则需要一个循环来初始化所有6个数组。

Args dati;
for (int i = 0; i < 6; i++) {
  dati.in[i] = inn[i];
  dati.out[i] = ou[i];
}

同样,在你的线程中,你只处理数组中的第一个元素。所以这段代码:

Args* arg = (Args*)param;
cvtColor(*arg->in,*arg->out,CV_BGR2GRAY);

需要成为这样的东西:

Args* arg = (Args*)param;
for (int i = 0; i < 6; i++) {
  cvtColor(arg->in[i],arg->out[0],CV_BGR2GRAY);
}