mam funkcję rekurencyjną która tworzy model piramidy Sierpińskiego i chciałem przepisać ją na wątek by się szybciej wykonywała
kod funkcji:
void __cdecl creatorthread(void * args)
{
HANDLE help;
InStruct * in=(InStruct*)args;
vector<HANDLE>threads;
vector<vector<Triangle3d>>triangles;
if (in->lvl>1)
{
InStruct * helpin=new InStruct[4];
for (unsigned int i=0; i<4; i++)
{
triangles.push_back(vector<Triangle3d>());
helpin[i].triangles=&triangles[i];
helpin[i].lvl=in->lvl-1;
helpin[i].l=in->l/2;
switch(i)
{
case 0:
{
helpin[i].x=in->x;
helpin[i].y=in->y-in->l*sqrt(3)/6;
helpin[i].z=in->z;
break;
}
case 1:
{
helpin[i].x=in->x+in->l/4;
helpin[i].y=in->y+in->l*0.5*sqrt(3)/6;
helpin[i].z=in->z+in->l*0.5*sqrt(3)/6;
break;
}
case 2:
{
helpin[i].x=in->x-in->l/4;
helpin[i].y=in->y+in->l*0.5*sqrt(3)/6;
helpin[i].z=in->z+in->l*0.5*sqrt(3)/6;
break;
}
case 3:
{
helpin[i].x=in->x;
helpin[i].y=in->y+in->l*0.5*sqrt(3)/6;
helpin[i].z=in->z-in->l*sqrt(3)/6;
break;
}
}
threads.push_back(help);
threads[threads.size()-1]=(HANDLE)_beginthread(creatorthread,0,&helpin[i]);
}
WaitForMultipleObjects(threads.size(),&threads[0],TRUE,INFINITE);
for (unsigned int i=0; i<4; i++)
{
for (unsigned int j=0; j<triangles[i].size(); j++)
in->triangles->push_back(triangles[i][j]);
}
delete[]helpin;
triangles.clear();
}
else if (in->lvl==1)
{
Triangle3d tri3d;
tri3d.points[0].x=in->x;
tri3d.points[0].y=in->y-2*in->l*sqrt(3)/6;
tri3d.points[0].z=in->z;
tri3d.points[1].x=in->x-in->l/2;
tri3d.points[1].y=in->y+in->l*sqrt(3)/6;
tri3d.points[1].z=in->z+in->l*sqrt(3)/6;
tri3d.points[2].x=in->x+in->l/2;
tri3d.points[2].y=in->y+in->l*sqrt(3)/6;
tri3d.points[2].z=in->z+in->l*sqrt(3)/6;
tri3d.points[3].x=in->x;
tri3d.points[3].y=in->y+in->l*sqrt(3)/6;
tri3d.points[3].z=in->z-2*in->l*sqrt(3)/6;
in->triangles->push_back(tri3d);
}
_endthread();
}
a tu są klasy
class Color
{
public:
double r,g,b;
Color()
{
r=0;
g=0;
b=0;
}
Color(const Color & target)
{
r=target.r;
g=target.g;
b=target.b;
}
};
class Triangle3d
{
class Point
{
public:
double x,y,z;
Point()
{
x=0;
y=0;
z=0;
}
Point(const Point & target)
{
x=target.x;
y=target.y;
z=target.z;
}
};
public:
Point points[4];
Triangle3d(){};
Triangle3d(const Triangle3d& target)
{
points[0]=target.points[0];
points[1]=target.points[1];
points[2]=target.points[2];
points[3]=target.points[3];
}
};
struct InStruct
{
double x,y,z,l;
vector<Triangle3d>*triangles;
unsigned int lvl;
InStruct()
{
x=0;
y=0;
z=0;
l=0;
lvl=0;
triangles=NULL;
}
InStruct(const InStruct & target)
{
x=target.x;
y=target.y;
z=target.z;
l=target.l;
triangles=target.triangles;
lvl=target.lvl;
}
InStruct(double X,double Y,double Z,double L,vector<Triangle3d>*Triangles,unsigned int Lvl)
{
x=X;
y=Y;
z=Z;
l=L;
triangles=Triangles;
lvl=Lvl;
}
~InStruct()
{
triangles=NULL;
}
};
przy poziomie 1 funkcja działa dobrze ale przy wyższych poziomach są crashe, dlaczego?