[Insight-users] Using smart pointer in a dll

Thomas Lambertz thomas at hexerei-software.de
Mon Apr 17 20:41:58 EDT 2006


Hi there,

i have some newbie questions about the correct use of smart pointer in a 
dll. Afaik itk uses smart pointer which have a livetime of the scope 
where the are created in. So "all" i have to do is using itkImage (for 
example) within a common scope. Hm

Can i instantiate a itkImage in an class constructor ? (i would say no - 
after return the image would be deleted - correct ?)
I first tried this way but i get randomly violations when accessing the 
itkimage. So i searched the mailinglistarchive and found this 
http://public.kitware.com/pipermail/insight-users/2004-November/011095.html 
mail from Luis Ibanez. He told that there would be two options for 
approaching the problem. Option A was to create the image in a function 
and pass the smart pointer to the processing functions. He recommend 
this way. As a result the processing functions have to be called within 
this creating function (correct ?). But what about user interaction ? 
For example read a slice series into a itkimage and then let the user 
scroll through the slices. I would prefer to have to functions/methods 
to do this ReadSeriesIntoImage() and ShowSlice(). So when 
ReadSeriesIntoImage was done i have to leave my dll and wait for some 
user action - and if a have understand this correct i have no common 
scope between these two methods.
Option B was a kind of faking a bit with Register()  then return and 
then UnRegister(). I tried that way and i got violations by accessing 
that image randomly (which makes me believe, that the memorystructure 
was overwritten by something else). Maybe someone has enough patience to 
read my code...

Read the fileSeries: (seems to work properly - its a modified copy and 
paste of what Luis wrote)
void * dDicom::myFunction( std::string* seriesID)
    {
        FileNamesContainer fileNames;
        nameGenerator->GetSeriesUIDs();
        fileNames = nameGenerator->GetFileNames( seriesID->c_str() );

        ReaderType_u16_3d::Pointer reader = ReaderType_u16_3d::New();
        reader->SetImageIO( dio );
        reader->SetFileNames( fileNames );
        try {
            reader->Update();
        }
        catch (itk::ExceptionObject &ex) {
            MessageBox(GetActiveWindow(), ex.GetDescription() , 
"ReadSeries", MB_SETFOREGROUND);
        }

        IT_PTu16_3D::Pointer fakeimage = reader->GetOutput();
        fakeimage->Register();
        return fakeimage.GetPointer();
    }


a little wrapper
int dDicom::getFile(std::string* seriesID) {
    storedImage=(IT_PTu16_3D *)this->myFunction(seriesID);
    storedImage->UnRegister();

    IT_PTu16_3D::RegionType inputRegion;
    inputRegion = storedImage->GetLargestPossibleRegion();
    IT_PTu16_3D::SizeType size = inputRegion.GetSize();
    slices = size[2];
    return 1;
}


Showing a Slice:

void dDicom::showSlice(int slice) {
    try {   
        IT_PTu16_3D::SizeType size;
        IT_PTu16_3D::RegionType inputRegion;

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// next line is where the crashes sometimes(!) happens
// structure of storedImage overwritten ?
// best way to provoke this on my maschine is to minimize/restore the 
window and then call showSlice - but its not deterministic
// to prevent other sideeffects i excluded Paint and Resize Events from 
my Application
        inputRegion = storedImage->GetLargestPossibleRegion();
       
        size = inputRegion.GetSize();
        int max = size[2];
        size[2]=0;    // only 2 dimensions

        IT_PTu16_3D::IndexType start = inputRegion.GetIndex();
        start[2]=slice;
       
        IT_PTu16_3D::RegionType desiredRegion;
        desiredRegion.SetSize( size );
        desiredRegion.SetIndex ( start );
       
        filter->SetExtractionRegion( desiredRegion );
        filter->SetInput( storedImage );
        filter->UpdateLargestPossibleRegion();
       
        connector->SetInput( filter->GetOutput() );
        connector->UpdateLargestPossibleRegion();
       
        myvtkviewer->SetInput( connector->GetOutput() );
        myvtkviewer->SetSize(size[0],size[1]);
        myvtkviewer->Render();
    }
    catch (itk::ExceptionObject &ex) {
        MessageBox(GetActiveWindow(), ex.GetDescription() , "ShowSlice", 
MB_SETFOREGROUND);
    }
}


Crashed could be localised in showSlice - i made some remarks before 
that line. storedImage is a member variable of my class dDicom and 
should store the image after reading. Much code for a mail and i hope i 
didnt bother you with that.

Ok - what can i do at this point ? Reading the sliceSeries everytime ( 
or even the requested slice) seems not very promising - espacially when 
refresh comes into play. One thought was to start a separate thread for 
holding the image - but that sounds like breaking a butterfly on a wheel 
to me.

Maybe someone would be kind enough to give me some hints for a solution.

Thanks in advance,
with kind regards,
Tom


More information about the Insight-users mailing list