<div dir="ltr">It's not likely to change in the near future... (define "near"...?)<div><br></div><div>Even if we did change it today to make it easy to access any VTK object from any thread, it would likely take on the order of months to years to iron out all the pursuant issues.<br>
<br></div><div>You will have to be careful using VTK objects from multiple threads. The safest solution (probably negating any benefits achieved through the use of multiple threads) would be to access all VTK objects in your program via a single "I'm accessing VTK" mutex. Or at least to have a mutex for every group of related VTK objects. Quite an organizational task on your part...</div>
<div><br></div><div>"You're welcome" for the quick answer... I know it's probably not the one you wanted. :-)</div><div><br></div><div>David</div><div><br></div><div><br></div><div><div class="gmail_quote">
On Tue, Aug 12, 2008 at 9:40 AM, Andreas Brüning <span dir="ltr"><<a href="mailto:mail-andi@web.de">mail-andi@web.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
in this case it does not make sense to split the vtk pipeline in different threads. Will this been changed in the near future or do i have to redesign my program?<br>
<br>
thank you for the quick answer<br>
Andi<br>
<div class="Ih2E3d"><br>
<br>
<br>
VTK's ref counting mechanism (C++ ++ and -- operators...) is not<br>
thread safe. All VTK objects that have any chance of being related to<br>
each other must all be created and destroyed from the same thread.<br>
The only way you could use VTK objects from another thread would be<br>
to create them, use them and destroy them completely from that thread<br>
without relating them to any VTK objects that were created on other<br>
threads...<br>
<br>
<br>
Does that make sense?<br>
<br>
<br>
HTH,<br>
David<br>
<br>
<br>
<br>
<br>
On Tue, Aug 12, 2008 at 9:12 AM, Andreas Brüning <<a href="mailto:mail-andi@web.de">mail-andi@web.de</a>><br>
wrote:<br>
Hello everyone,<br>
<br>
regarding to my post from beginning of august:<br>
<br>
<a href="http://www.vtk.org/pipermail/vtkusers/2008-August/096309.html" target="_blank">http://www.vtk.org/pipermail/vtkusers/2008-August/096309.html</a><br>
<br>
i recompiled vtk with VTK_DEBUG_LEAKS flag in CMAKE and with use of<br>
vtkDebugLeaks i printed out the undeleted vtkobjects right before i<br>
close the program . I found out that if i create vtk objects in<br>
</div>different threads the delete funtionality doesn t work anymore. When<br>
<div><div></div><div class="Wj3C7c">i only create vtkobjects in the mainThread they delete completely.<br>
But when i create different threads and in there new vtkObjects,<br>
dozens of vtkobjects remain in the memory.Even those i never created<br>
by myself. I call always the New() and Delete() methods for every<br>
vtkobject in the thread. And it happens with all kinds of vtkobjects.<br>
<br>
Here is an example of a thread-method:<br>
<br>
UINT __cdecl CImageVtkWnd::ResultView_2dMPR(LPVOID lpParameter )<br>
{<br>
<br>
//managing class of the threads<br>
CImageVtkWnd *pThis = static_cast<CImageVtkWnd *>(lpParameter);<br>
<br>
ASSERT(pThis != NULL);<br>
<br>
<br>
// Create the the renderer, window and interactor objects.<br>
vtkRenderer *vtk_Renderer = vtkRenderer::New();<br>
<br>
vtkWin32OpenGLRenderWindow *vtk_Win32OpenGLWindow = vtkWin32OpenGLRend<br>
erWindow::New();<br>
vtk_Win32OpenGLWindow->AddRenderer(vtk_Renderer);<br>
<br>
double *spacing = pThis->m_vtkvolumedata->GetSpacing();<br>
vtkImageShiftScale *vtk_scale = vtkImageShiftScale::New();<br>
<br>
vtk_scale->SetInput(pThis->m_vtkvolumedata);<br>
vtk_scale->SetShift(0.5*pThis->m_dWindow - pThis->m_dLevel);<br>
vtk_scale->SetScale(255.0/pThis->m_dWindow);<br>
vtk_scale->ClampOverflowOn();<br>
vtk_scale->SetOutputScalarTypeToUnsignedChar();<br>
<br>
vtkImageReslice *vtkImageReslicer = vtkImageReslice::New();<br>
vtkImageReslicer->SetInput(vtk_scale->GetOutput());<br>
vtkImageReslicer->SetOutputDimensionality(2);<br>
vtkImageReslicer->SetInterpolationModeToLinear();<br>
<br>
vtkImageReslicer->SetOutputSpacing(spacing);<br>
vtkImageReslicer->ReleaseDataFlagOn();<br>
<br>
vtkImageActor *vtk_actor = vtkImageActor::New();<br>
vtk_actor->SetInput(vtkImageReslicer->GetOutput());<br>
<br>
vtkTransform *vtk_slicetransform = vtkTransform::New();<br>
<br>
vtk_Renderer->AddActor(vtk_actor);<br>
vtk_Renderer->ResetCamera();<br>
vtk_Renderer->GetActiveCamera()->ParallelProjectionOn();<br>
<br>
DWORD MultiLockObj = 0;<br>
<br>
CSyncObject* pWaitObjects[] = { pThis->m_hRenderEvent, pThis->m_<br>
hTerminateLoopEvent, pThis->m_hResizeEvent };<br>
<br>
CMultiLock MultiLock( pWaitObjects, 3L );<br>
<br>
vtk_slicetransform->Translate(pThis->m_pSliceCenter[0], pThis->m_<br>
pSliceCenter[1], pThis->m_pSliceCenter[2]);<br>
vtk_slicetransform->RotateZ(-pThis->m_dSliceAngle_z);<br>
vtk_slicetransform->RotateX(-pThis->m_dSliceAngle_x);<br>
vtk_slicetransform->RotateY(-pThis->m_dSliceAngle_y);<br>
<br>
CSize *size = new CSize(600,800);<br>
<br>
unsigned char *tmpdata;<br>
<br>
BITMAPINFO bmi={0};<br>
bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);<br>
bmi.bmiHeader.biPlanes=1;<br>
bmi.bmiHeader.biCompression=BI_RGB;<br>
bmi.bmiHeader.biBitCount=24;<br>
bmi.bmiHeader.biWidth=size->cx;<br>
bmi.bmiHeader.biHeight=size->cy;<br>
bmi.bmiHeader.biSizeImage=size->cx * size->cy * 24;<br>
<br>
vtk_Win32OpenGLWindow->SetSize(size->cx,size->cy);<br>
vtk_Win32OpenGLWindow->OffScreenRenderingOn();<br>
<br>
do<br>
{<br>
if(MultiLockObj == (WAIT_OBJECT_0+1))<br>
{<br>
break;<br>
}<br>
<br>
//reslice<br>
if(MultiLockObj == (WAIT_OBJECT_0+2))<br>
{<br>
vtk_slicetransform->Identity();<br>
vtk_slicetransform->Translate(pThis->m_pSliceCenter[0], pThis->m_<br>
pSliceCenter[1], pThis->m_pSliceCenter[2]);<br>
<br>
vtk_slicetransform->RotateZ(-pThis->m_dSliceAngle_z);<br>
vtk_slicetransform->RotateX(-pThis->m_dSliceAngle_x);<br>
vtk_slicetransform->RotateY(-pThis->m_dSliceAngle_y);<br>
<br>
vtkImageReslicer->SetResliceAxes(vtk_slicetransform->GetMatrix());<br>
}<br>
vtk_Win32OpenGLWindow->Render();<br>
<br>
vtk_Renderer->ResetCamera();<br>
::EnterCriticalSection(&pThis->m_cs);<br>
tmpdata = vtk_Win32OpenGLWindow->GetPixelData(0,0,size->cx-1, size-><br>
cy,1);<br>
<br>
pThis->m_lbitmap->ConvertFromDIB(&bmi,(L_UCHAR *) tmpdata);<br>
pThis->m_lbitmap->SetXResolution(pThis->m_iSource_resolution);<br>
pThis->m_lbitmap->SetYResolution(pThis->m_iSource_resolution);<br>
pThis->m_lbitmap->CalculateXYRes();<br>
pThis->m_lbitmap->GrayScale(pThis->m_iGrayscale);<br>
<br>
LeaveCriticalSection(&pThis->m_cs);<br>
<br>
<br>
::PostMessage(pThis->m_cParent->GetSafeHwnd(),WM_VTK_UPDATE_WINDOW,1,<br>
NULL);<br>
<br>
<br>
delete tmpdata;<br>
<br>
<br>
MultiLockObj = MultiLock.Lock( INFINITE, FALSE );<br>
}<br>
while(1);<br>
<br>
//Cleanup<br>
delete size;<br>
<br>
<br>
vtk_Renderer->Delete();<br>
vtk_Win32OpenGLWindow->Delete();<br>
vtk_scale->Delete();<br>
vtkImageReslicer->Delete();<br>
vtk_actor->Delete();<br>
vtk_slicetransform->Delete();<br>
<br>
::AfxEndThread( 0, true );<br>
return 0L;<br>
<br>
}<br>
<br>
<br>
<br>
<br>
Does anybody has an idea why i cant delete vtk objects in a thread?<br>
i tried already to cut the connections between vtkobjects in the<br>
</div></div>different threads, but it also doesn t helped.<br>
<br>
Thanks in advance<br>
Andi<br>
<br>
_______________________________________________<br>
<div class="Ih2E3d"> This is the private VTK discussion list.<br>
Please keep messages on-topic. Check the FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/<br>
Wiki/VTK_FAQ</a><br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>
<br>
<br>
<br>
<br>
<br>
</div><div><div></div><div class="Wj3C7c">________________________________________________________________________<br>
Schon gehört? Bei <a href="http://WEB.DE" target="_blank">WEB.DE</a> gibt' s viele kostenlose Spiele:<br>
<a href="http://games.entertainment.web.de/de/entertainment/games/free/index.html" target="_blank">http://games.entertainment.web.de/de/entertainment/games/free/index.html</a><br>
<br>
</div></div></blockquote></div><br></div></div>