[vtkusers] Solved: Segfault when using CreateTimer()

Torquil Macdonald Sørensen torquil at gmail.com
Tue Jul 1 09:26:28 EDT 2008


Hello, I found the error. The example was originally using vtkInteractorStyle, 
but I had removed it since I figured that I could use the default 
interaction. So the "caller" parameter to the callback function was not a 
vtkInteractorStyle object, but my vtkRenderWindowInteractor. So it works when 
I modify the callback function it as follows:

void myTimerCallback(vtkObject* caller, unsigned long eid, void*
	clientdata, void* calldata)
{
vtkRenderWindowInteractor* iren = (vtkRenderWindowInteractor*) caller;
.
.
.

Best regards
Torquil Sørensen

On Tuesday 1. July 2008 12:32, Torquil Macdonald Sørensen wrote:
> Hello, can anybody with a trained VTK-eye see why the program segfaults?
>
> I am trying to have a callback function so that a simulation can proceed at
> the same time as I use the mouse to interact with the plot. I have tried to
> adapt an example that I found, but I get a segfault as soon as I try to use
> CreateTimer() inside the callback function.
>
> I use CreateTimer() after renderWindowInteractor->Initialize() in main(),
> and that sees to work correctly since the program afterwards enters the
> callback function. But when the callback function calles CreateTimer(0), it
> segfaults. This is on Linux with VTK 5.0.4.
>
> Gdb, Valgrind, and the source is below:
>
> *** The output from gbd is:
>
> Program received signal SIGSEGV, Segmentation fault.
> [Switching to Thread -1208645904 (LWP 32354)]
> myTimerCallback (caller=0x8bdd0e8, eid=25, clientdata=0x0, calldata=0x0)
>     at timer.cpp:29
> 29              iren->CreateTimer(0); // <---- Segfault here
>
>
>
> *** Valgrind told me something like this:
>
> ==2063== Invalid read of size 4
> ==2063==    at 0x8048AAB: myTimerCallback(vtkObject*, unsigned long, void*,
> void*) (timer.cpp:29)
> ==2063==    by 0x4EAAE05: vtkCallbackCommand::Execute(vtkObject*, unsigned
> long, void*) (in
> /mn/anatu/cma-u3/tma/usr/stow/vtk/lib/libvtkCommon.so.5.0.4) ==2063==    by
> 0x4F391FD: vtkSubjectHelper::InvokeEvent(unsigned long, void*, vtkObject*)
> (in /mn/anatu/cma-u3/tac/usr/stow/vtk/lib/libvtkCommon.so.5.0.4) ==2063==  
>  by 0x4F392FE: vtkObject::InvokeEvent(unsigned long, void*) (in
> /mn/anatu/cma-u3/tmac/usr/stow/vtk/li/libvtkCommon.so.5.0.4)
> ==2063==    by 0x4180320: vtkXRenderWindowInteractorTimer(void*, unsigned
> long*) (in /mn/anatu/cma-u3/tmac/usr/sow/vtk/lib/libvtkRendering.so.5.0.4)
> ==2063==    by 0x70E0F61: (within /usr/lib/libXt.so.6.0.0)
> ==2063==    by 0x70E10A1: XtAppNextEvent (in /usr/lib/libXt.so.6.0.0)
> ==2063==    by 0x4181E9C: vtkXRenderWindowInteractor::Start()
> (in /mn/anatu/cma-u3/tmac/usr/stow/vtk/lib/libvtkRndering.so.5.0.4)
> ==2063==    by 0x8048C9D: main (timer.cpp:59)
>
>
>
> *** Here is a stripped-down version of my program:
>
> #include <vtk-5.0/vtkActor.h>
> #include <vtk-5.0/vtkCallbackCommand.h>
> #include <vtk-5.0/vtkCamera.h>
> #include <vtk-5.0/vtkInteractorStyle.h>
> #include <vtk-5.0/vtkOutlineSource.h>
> #include <vtk-5.0/vtkPolyDataMapper.h>
> #include <vtk-5.0/vtkRenderer.h>
> #include <vtk-5.0/vtkRenderWindow.h>
> #include <vtk-5.0/vtkRenderWindowInteractor.h>
>
> using namespace std;
>
> static const int time_max=20;
>
> void myTimerCallback(vtkObject* caller, unsigned long eid, void*
> clientdata, void* calldata) {
> 	vtkInteractorStyle* istyle = (vtkInteractorStyle *) caller;
> 	vtkRenderWindowInteractor* iren = istyle->GetInteractor();
> 	static int time = 0;
>
> // 	if (++time < time_max) {
> //		// Simulation steps here
> // 		cout << time << endl;
> // 		iren->CreateTimer(0);
> // 		return;
> // 	}
>
> 	time = 0;
> 	iren->CreateTimer(0); // <---- Segfault here
> }
>
> int main()
> {
> 	vtkRenderWindow* renderWindow = vtkRenderWindow::New();
> 	renderWindow->SetSize(400, 400);
>
> 	vtkRenderWindowInteractor* renderWindowInteractor =
> vtkRenderWindowInteractor::New();
> 	renderWindow->SetInteractor(renderWindowInteractor);
>
> 	vtkRenderer* renderer= vtkRenderer::New();
> 	renderer->SetBackground(0.0, 0.0, 0.0);
> 	renderWindow->AddRenderer(renderer);
>
> 	vtkOutlineSource* outlineSource = vtkOutlineSource::New();
> 	outlineSource->SetBounds(-1, 1, -1, 1, -1, 1);
> 	vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();
> 	outlineMapper->SetInput(outlineSource->GetOutput());
> 	vtkActor* outlineActor = vtkActor::New();
> 	outlineActor->SetMapper(outlineMapper);
> 	renderer->AddActor(outlineActor);
>
> 	vtkCallbackCommand* timerCB = vtkCallbackCommand::New();
> 	timerCB->SetCallback(myTimerCallback);
> 	renderWindowInteractor->AddObserver(vtkCommand::TimerEvent, timerCB);
>
> 	renderWindowInteractor->Initialize();
> 	renderWindowInteractor->CreateTimer(0);
> 	renderWindowInteractor->Start();
>
> 	outlineActor->Delete(); outlineMapper->Delete(); outlineSource->Delete();
> 	renderer->Delete(); renderWindowInteractor->Delete();
> renderWindow->Delete();
>
> 	return(0);
> }



More information about the vtkusers mailing list