将结构传递给线程

时间:2013-04-23 09:33:37

标签: c++ c winapi

我想知道如何将结构传递给线程。我编写了一个示例应用程序,我在main中声明了一个结构,并尝试将其传递给线程。

这是我的代码:

DWORD WINAPI Name1(LPVOID lparam)
{
    data x;
    x.name[15]="Sarah";
    x.DOB="19/10/2007";
    fputs(stdout,name,15);
    fputs(stdout,DOB,15);

    return 0;
}

int main()
{
    struct data
    {
        char name[15];
        char DOB[15];
    };

    HANDLE thread2;
    DWORD threadID2;
    thread2= CreateThread(NULL,0,Name1,(LPVOID *)data,0,&threadID2);

    if(thread2==NULL)
    {
        cout<<"Couldn't Create Thread:("<<endl;
        exit(0);
    }

    return 0;
}

不幸的是,我没有把结构传递给线程:(如果有人帮助我,我会非常感激。

我尝试更改结构的数据类型以传递它,但是,我想我不知道该怎么做。

2 个答案:

答案 0 :(得分:5)

您正在将局部变量传递给线程启动函数。一旦变量超出范围,它将被销毁。这意味着当新线程尝试访问它时它可能不存在。您应该为整数类型传递值,或者在动态存储(堆)中分配对象。

一旦新线程有指向对象的指针,它也应该负责销毁它。这一切都取决于您希望如何分配和管理对象的所有权。

struct Foo
{
    char name[15];
    char DOB[15];
};

void Start()
{
    Foo *someObject = new Foo();

    CreateThread(NULL, 0, threadFunc, (LPVOID *)someObject, 0, &threadID2);
}

DWORD WINAPI threadFunc(void *v)
{
    Foo *someObject = static_cast<Foo*>(v);

    delete someObject;

    return 0;
}

答案 1 :(得分:2)

如果要将结构传递给线程,则必须在堆上获取该结构而不是堆栈,并将其地址传递给线程。 我还修正了一些错误......比如字符串副本等等......

我没有使用任何typedef,因为看起来你正在使用C ++。

struct data{
    char name[15];
    char DOB[15];
};

DWORD WINAPI Name1(LPVOID lparam)
{
    data *x = (data*)lparam;
    strcpy(x->name, "Sarah");
    strcpy(x->DOB, "19/10/2007");
    fputs(stdout, x->name, 15);
    fputs(stdout, x->DOB, 15);

    HeapFree(GetProcessHeap(), 0, x);

    return 0;
}

int main()
{
    HANDLE thread2;
    DWORD threadID2;
    data * x;

    x = HeapAlloc(GetProcessHeap(), 0, sizeof(data));
    thread2= CreateThread(NULL, 0, Name1, (LPVOID)x, 0, &threadID2);
    if(thread2==NULL)
    {
        cout << "Couldn't Create Thread:(" << endl;
        exit(0);
    }

    return 0;
}