我想知道如何将结构传递给线程。我编写了一个示例应用程序,我在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;
}
不幸的是,我没有把结构传递给线程:(如果有人帮助我,我会非常感激。
我尝试更改结构的数据类型以传递它,但是,我想我不知道该怎么做。
答案 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;
}