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

Passing a struct to a thread, how access multiple data in struct?

本文关键字:结构体 访问 数据 何访问 线程      更新时间:2023-10-16

我有一个问题。我需要使用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);

现在,我的问题是:我需要访问从线程本身传递给线程的结构中两个数组"in"answers"out"的所有6个元素,或者找到一种将数组从0转移到5的模式,以用"灰色"函数详细说明所有元素。

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

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

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

*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);
}

当您启动线程时,以下代码:

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);
}