[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