Here s what I'm doing in a nutshell.
In my class's cpp file I have:
std::vector<std::vector<GLdouble>> ThreadPts[4]; The thread proc looks like this:
unsigned __stdcall BezierThreadProc(void *arg) { SHAPETHREADDATA *data = (SHAPETHREADDATA *) arg; OGLSHAPE *obj = reinterpret_cast<OGLSHAPE*>(data->objectptr); for(unsigned int i = data->start; i < data->end - 1; ++i) { obj->SetCubicBezier( obj->Contour[data->contournum].UserPoints[i], obj->Contour[data->contournum].UserPoints[i + 1], data->whichVector); } _endthreadex( 0 ); return 0; } SetCubicBezier looks like this:
void OGLSHAPE::SetCubicBezier(USERFPOINT &a,USERFPOINT &b, int ¤tvector ) { std::vector<GLdouble> temp; if(a.RightHandle.x == a.UserPoint.x && a.RightHandle.y == a.UserPoint.y && b.LeftHandle.x == b.UserPoint.x && b.LeftHandle.y == b.UserPoint.y ) { temp.clear(); temp.push_back((GLdouble)a.UserPoint.x); temp.push_back((GLdouble)a.UserPoint.y); ThreadPts[currentvector].push_back(temp); temp.clear(); temp.push_back((GLdouble)b.UserPoint.x); temp.push_back((GLdouble)b.UserPoint.y); ThreadPts[currentvector].push_back(temp); } } The code that calls the threads looks like this:
for(int i = 0; i < Contour.size(); ++i) { Contour[i].DrawingPoints.clear(); if(Contour[i].UserPoints.size() < 2) { break; } HANDLE hThread[4]; SHAPETHREADDATA dat; dat.objectptr = (void*)this; dat.start = 0; dat.end = floor((Contour[i].UserPoints.size() - 1) * 0.25); dat.whichVector = 0; dat.contournum = i; hThread[0] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0); dat.start = dat.end; dat.end = floor((Contour[i].UserPoints.size() - 1) * 0.5); dat.whichVector = 1; hThread[1] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0); dat.start = dat.end; dat.end = floor((Contour[i].UserPoints.size() - 1) * 0.75); dat.whichVector = 2; hThread[2] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0); dat.start = dat.end; dat.end = Contour[i].UserPoints.size(); dat.whichVector = 3; hThread[3] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0); WaitForMultipleObjects(4,hThread,true,INFINITE); }
Is there something wrong with this? I'd expect it to fill ThreadPts[4]; ... There should never be any conflicts the way I have it set up. I usually get error writing at... on the last thread where dat->whichvector = 3. If I remove:
dat.start = dat.end; dat.end = Contour[i].UserPoints.size(); dat.whichVector = 3; hThread[3] = (HANDLE)_beginthreadex(NULL,0,&BezierThreadProc,&dat,0,0); Then it does not seem to crash, what could be wrong?
Thanks