[vtkusers] User-defined ExitMethod to close an interactive vtk model by breaking threads to vtkRenderWindowInteractor and vtkRenderWindow gives Segmentation Fault

Anwar Upal upal at me.queensu.ca
Mon Nov 19 09:27:17 EST 2001


Dear All:

My MSc project involves describing the relative motions between bones in 
the wrist, given 3D reconstructed scans of the same wrist in more than one 
posture. I am using VTK for this purpose.  I am using another library V for 
designing my graphical user interface (gui).

My gui gives control to vtk to render the 3D images of the wrist in a 
vtkRenderWindow and starts the vtkRenderWindowInteractor.   When the user 
wants to close the 3D vtk model, stop the vtkRenderWindowInteractor, kill 
the vtkRenderWindow and come back to the gui for further computation, I 
experience a problem.

vtkRenderWindowInteractor's default exitMethod kills my application and gui 
as well as the vtkRenderWindow.  We defined a user-defined exitMethod to 
give control back to program by terminating the threads to 
vtkRenderWindowInteractor and vtkRenderWindow.  This gives me a 
segmentation fault when my exitMethod tries to break the threads.  Is there 
another way...?

I will show the relevant code below.  My program has a carpus class.  This 
class has a method called carpalRender for rendering the carpus.  And a new 
user-defined exitMethod to exit the vtk window opened by carpalRender.

class carpus
{
private:

   //I define these as members of carpus so that I can terminate the 
threads from my exit method

   vtkRenderWindowInteractor *iren;
   vtkRenderWindow* renWindow;
   vtkRenderer* scene_render;
   ...

public:
   //render to show itself
   void carpalRender(...);

   //new exit method for vtkWindowInteractor so it does not terminate 
application
   void carpus::MemberExitMethod(void *arg);
   ...
};

Now Here is the relevant code from the method carpus::carpalRender which 
calls the ExitMethod.

void carpus::carpalRender(...)
{
   ...
   renWindow = vtkRenderWindow::New();
   ...

   // Create window interactor
   iren = vtkRenderWindowInteractor::New();
   ...

   // set the user-defined C-style ExitMethod as the new exit method
   iren->SetExitMethod (ExitMethod,NULL);

   // Draw the resulting scene
   renWindow->Render();

   // Enable mouse interaction
   iren->Start();

   //since vtkRenderWindowInteractor does not give control back to 
carpalRender
   //any further code in carpalRender would not get executed
};

Now the following segment of code is the C-style exit method which then 
executes another MemberExitMethod which is a member of the carpus class.

//*********************>>> ExitMethod <<<<************************//
   void ExitMethod(void *arg)
   {
     static_cast<carpus*>(arg)->MemberExitMethod(arg);
   };

//*********************>>> carpus::MemberExitMethod 
<<<<************************//
   void carpus::MemberExitMethod(void *arg)
   {
     iren->Delete();
     renWindow->Delete();
  };

Any ideas are welcome.  Thanks,
Anwar Upal



 >hi,
 >
 >>>>> "Bill" == William A Hoffman <billlist at nycap.rr.com> writes:
 >
 >    Bill> VTK callback functions are all C functions and can not be
 >    Bill> member functions.  To call a member function, you have to
 >    Bill> create a "C" function that calls the member funciton:
 >
 >    Bill> Something like this:
 >
 >    Bill> void newExtiMethod(void* arg) {
 >    Bill> static_cast<classname*>(arg)->newExitMethod(); }
 >
 >Are you sure?  Shouldnt the following code also work?
 >
 >class Foo{
 >
 >      // ...
 >      static void ExitMethod (void *arg);
 >}
 >
 >iren->SetExitMethod(&Foo::ExitMethod, NULL);
 >
 >prabhu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20011119/ce9a4bd6/attachment.htm>


More information about the vtkusers mailing list