通过指针将结构体传递给函数

3

我正在使用Win32 API以及_begunthreadex调用来运行线程,如下:

struct StructItem
{
   std::string title;
   int amount;
};

StructItem structItems[33];
unsigned int id;
HANDLE thread = (HANDLE)_beginthreadex(NULL, 0, my_thread, (void*)structItems, 0, &id);

这是我的线程:

unsigned int __stdcall my_thread(void *p)
{
    for (int i = 0; i < 20; i++)
    {           
        // todo: print struct.title
        Sleep(1000);
    }

    return 0;
}

就我所理解的,*p是指向我的结构体列表的指针,因为我将它们传递给了_beginthreadex调用的第4个参数,但我不知道如何转换*p,以便我能从线程内部访问结构体数组。


(StructItem*)p; 可能是吗? - πάντα ῥεῖ
@πάνταῥεῖ 但这是一个结构体数组,而不是单个结构体。 - 0x29a
@0x29a 你真的需要使用Win32线程吗?自从C++11以来,有了std::thread - Ted Lyngmo
@TedLyngmo 我在后台运行std::thread时遇到了麻烦,它一直挂起主UI,我无法解决它,我会再试一次,谢谢! - 0x29a
@0x29a 请看这里:https://dev59.com/m3M_5IYBdhLWcg3wPAnU - πάντα ῥεῖ
2个回答

7

由于数组在传递为参数时会衰变成一个StructItem*(数组第一个元素的位置),因此需要将其转换回StructItem*类型。

unsigned int __stdcall my_thread(void *p)
{
    auto items = static_cast<StructItem*>(p);
    for (int i = 0; i < 20; i++)
    {           
        std::cout << items[i].title << '\n';
        Sleep(1000);
    }
    return 0;
}

请注意,将类型转换为void*是完全不必要的。

1
你可以将void指针转换为你的结构体指针类型,然后对该指针表达式进行解引用以获取特定偏移量处的元素:
*((StructItem*) p); /* first element */
*((StructItem*) p+ 1); /* second element */

这是一个C风格的方法。然而,我更喜欢已经回答过的C++风格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接