[vtkusers] Delete vtk objects

Andreas Brüning mail-andi at web.de
Tue Aug 12 09:12:40 EDT 2008


Hello everyone,

regarding to my post from beginning of august:

http://www.vtk.org/pipermail/vtkusers/2008-August/096309.html

i recompiled vtk with VTK_DEBUG_LEAKS flag in CMAKE and with use of vtkDebugLeaks i printed out the undeleted vtkobjects right before i close the program . I found out that if i create vtk objects in different threads the delete funtionality doesnŽt work anymore. When i only create vtkobjects in the mainThread they delete completely. But when i create different threads and in there new vtkObjects, dozens of vtkobjects remain in the memory.Even those i never created by myself.  I call always the New() and Delete() methods for every vtkobject in the thread. And it happens with all kinds of vtkobjects.

Here is an example of a thread-method:

 UINT __cdecl CImageVtkWnd::ResultView_2dMPR(LPVOID lpParameter )
 {

        //managing class of the threads
	 CImageVtkWnd *pThis = static_cast<CImageVtkWnd *>(lpParameter);

	ASSERT(pThis != NULL);

	
	// Create the the renderer, window and interactor objects.
	vtkRenderer *vtk_Renderer = vtkRenderer::New();

	vtkWin32OpenGLRenderWindow *vtk_Win32OpenGLWindow = vtkWin32OpenGLRenderWindow::New();
	vtk_Win32OpenGLWindow->AddRenderer(vtk_Renderer);
 
	double *spacing = pThis->m_vtkvolumedata->GetSpacing();
	vtkImageShiftScale *vtk_scale = vtkImageShiftScale::New();

	vtk_scale->SetInput(pThis->m_vtkvolumedata);
	vtk_scale->SetShift(0.5*pThis->m_dWindow - pThis->m_dLevel);
	vtk_scale->SetScale(255.0/pThis->m_dWindow);
	vtk_scale->ClampOverflowOn();
	vtk_scale->SetOutputScalarTypeToUnsignedChar(); 

	vtkImageReslice *vtkImageReslicer = vtkImageReslice::New();
	vtkImageReslicer->SetInput(vtk_scale->GetOutput());
	vtkImageReslicer->SetOutputDimensionality(2);
	vtkImageReslicer->SetInterpolationModeToLinear();

	vtkImageReslicer->SetOutputSpacing(spacing);
	vtkImageReslicer->ReleaseDataFlagOn();
	
	vtkImageActor *vtk_actor = vtkImageActor::New();
	vtk_actor->SetInput(vtkImageReslicer->GetOutput());

	vtkTransform *vtk_slicetransform	= vtkTransform::New();
			
	vtk_Renderer->AddActor(vtk_actor);
	vtk_Renderer->ResetCamera();
	vtk_Renderer->GetActiveCamera()->ParallelProjectionOn();
		
	DWORD MultiLockObj = 0;

	CSyncObject* pWaitObjects[] = { pThis->m_hRenderEvent, pThis->m_hTerminateLoopEvent, pThis->m_hResizeEvent };
	
	CMultiLock MultiLock( pWaitObjects, 3L );

	vtk_slicetransform->Translate(pThis->m_pSliceCenter[0], pThis->m_pSliceCenter[1], pThis->m_pSliceCenter[2]);
	vtk_slicetransform->RotateZ(-pThis->m_dSliceAngle_z);
	vtk_slicetransform->RotateX(-pThis->m_dSliceAngle_x);
	vtk_slicetransform->RotateY(-pThis->m_dSliceAngle_y);
 		
	CSize *size = new CSize(600,800);

	unsigned char *tmpdata;
	
	BITMAPINFO bmi={0};
	bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biPlanes=1;
	bmi.bmiHeader.biCompression=BI_RGB;
	bmi.bmiHeader.biBitCount=24;
	bmi.bmiHeader.biWidth=size->cx;
	bmi.bmiHeader.biHeight=size->cy;
	bmi.bmiHeader.biSizeImage=size->cx * size->cy * 24;	

	vtk_Win32OpenGLWindow->SetSize(size->cx,size->cy);
	vtk_Win32OpenGLWindow->OffScreenRenderingOn();
	
        do
	{         
		if(MultiLockObj == (WAIT_OBJECT_0+1))
		{
			break;
		}

		//reslice
		if(MultiLockObj == (WAIT_OBJECT_0+2))
		{
			vtk_slicetransform->Identity();
			vtk_slicetransform->Translate(pThis->m_pSliceCenter[0], pThis->m_pSliceCenter[1], pThis->m_pSliceCenter[2]);

			vtk_slicetransform->RotateZ(-pThis->m_dSliceAngle_z);
			vtk_slicetransform->RotateX(-pThis->m_dSliceAngle_x);
			vtk_slicetransform->RotateY(-pThis->m_dSliceAngle_y);

			vtkImageReslicer->SetResliceAxes(vtk_slicetransform->GetMatrix());
		}
		vtk_Win32OpenGLWindow->Render();

		vtk_Renderer->ResetCamera();
		::EnterCriticalSection(&pThis->m_cs);
		tmpdata = vtk_Win32OpenGLWindow->GetPixelData(0,0,size->cx-1, size->cy,1);	

		pThis->m_lbitmap->ConvertFromDIB(&bmi,(L_UCHAR *)	tmpdata); 
		pThis->m_lbitmap->SetXResolution(pThis->m_iSource_resolution);
		pThis->m_lbitmap->SetYResolution(pThis->m_iSource_resolution);
		pThis->m_lbitmap->CalculateXYRes();
		pThis->m_lbitmap->GrayScale(pThis->m_iGrayscale);
			
	 	LeaveCriticalSection(&pThis->m_cs);
	

	::PostMessage(pThis->m_cParent->GetSafeHwnd(),WM_VTK_UPDATE_WINDOW,1,NULL);
	

		delete tmpdata;

	
		MultiLockObj = MultiLock.Lock( INFINITE, FALSE ); 
	}
	while(1); 

	//Cleanup
	delete size;
 

	vtk_Renderer->Delete();
	vtk_Win32OpenGLWindow->Delete();
	vtk_scale->Delete();
	vtkImageReslicer->Delete();
	vtk_actor->Delete();
        vtk_slicetransform->Delete();

        ::AfxEndThread( 0, true );
        return 0L;

 }




Does anybody has an idea why i cant delete vtk objects in a thread? i tried already to cut the connections between vtkobjects in the different threads, but it also doesnŽt helped. 

Thanks in advance 
Andi


________________________________________________________________________
Schon gehört? Bei WEB.DE gibt' s viele kostenlose Spiele:
http://games.entertainment.web.de/de/entertainment/games/free/index.html




More information about the vtkusers mailing list