【问题标题】:Passing a struct to a thread, how access multiple data in struct?将结构传递给线程,如何访问结构中的多个数据?
【发布时间】:2013-05-29 08:21:30
【问题描述】:

我有问题。我需要使用 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”和“out”的所有 6 个元素,或者找到一种将数组从 0 转换为 5 的模式以进行详细说明所有具有“灰色”功能的元素。

如何从线程或主线程执行此操作?我的意思是使用灰色函数来详细说明我在该模式下传递给线程的 struct Args [6] 中的数组 Mat 的所有 6 个元素。

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

【问题讨论】:

  • 你的问题不是很清楚。如果你的意思是说你想在线程已经创建时将变量值传递给它,你可以考虑使用“队列”....
  • 您的线程已经在结构中的数组中包含所有六个条目,但您只是设置和访问第一个条目。如果你想在线程中复制数组,所以你的洗牌不会改变结构中的数组,那么只需在线程函数和copy it中创建新数组。
  • 另外,为什么线程函数中有循环,当你一释放互斥锁就退出线程?
  • 正是...如何在一个线程中处理所有六张图片?我可以做吗?还是我必须为每个单独的图像创建一个线程?如何创建队列?我为这个问题道歉,但直到最近我才不得不处理线程......
  • 遍历它们? for (int i = 0; i < 6; i++) { /* use arg->in[i] */ }?当然,这需要您在将数组传递给数组之前正确设置数组,而您现在不这样做。

标签: c++ opencv


【解决方案1】:

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

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

【讨论】:

  • 我不明白这是怎么做的:如何复制所有数组?提前感谢您的宝贵时间。
  • @Domenico std::copy 函数处理它。这就是它的作用,复制东西。
【解决方案2】:

当您启动线程时,此代码:

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

【讨论】:

  • 这个修改,不起作用...Visual C++ 不编译...为什么?? :(
  • 假设innou 是您的源数组的实际名称,那么我在第一个循环中将ou 变量输入错误为out。已更新我的答案。如果这不是问题,您需要提供这些变量的完整定义。我只是猜测它们是如何定义的。
  • 我贴出完整的代码让你明白。我发布它就像一个答案,好吗?提前感谢您的耐心等待。
  • 您在将循环添加到cvtColor 调用时删除了Args* arg = (Args*)param; 行。此外,如果您使用循环复制元素,则无需执行 std::copy。无论哪种方式都应该有效 - 选择您喜欢的任何一种。虽然如果你想使用 std::copy 我认为你需要添加另一个包含。
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2012-10-14
  • 2017-05-25
  • 1970-01-01
  • 2019-11-09
  • 2018-04-17
  • 1970-01-01
相关资源
最近更新 更多