It looks like vtkCamera-&gt;GetFrustumPlanes isn&#39;t thread safe?  It makes quite a few changes to some of the it&#39;s member variables.  I tried adding a mutex lock between vtkCommand::Start/EndEvent, but I&#39;m still seg faulting.<div>

<br></div><div>Thanks,</div><div>Justin</div><div><div><br><div class="gmail_quote">On Sat, Apr 28, 2012 at 3:23 PM, Justin Rosen <span dir="ltr">&lt;<a href="mailto:jmylesrosen@gmail.com" target="_blank">jmylesrosen@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>If anyone one knows a bit about using vtk and boost threads I&#39;d really appreciate the help.  I&#39;m fairly new to vtk and threads in general and I&#39;m trying to figure out why calling vtkCamera-&gt;GetFrustumPlanes from a boost thread eventually segfaults.  It takes quite a few of iterations before the segfault occurs.</div>


<div><br></div><div>The general idea is that I have main application UI and a worker thread in the background which&#39;ll be doing some processing (Eventually updating/modifying a list of actors).  At the moment I&#39;m just trying to get the cameras view frustum...<div>


<div><br></div><div>If I remove the call to camera-&gt;GetFrustumPlanes the application runs without seg faulting.  Any idea what I may be doing wrong?<br><br><div>void workerFunc(vtkCamera *camera)</div><div>{</div><div>


  double prevUp[3] = {0, 0, 0};</div><div>  double prevFocal[3] = {0, 0, 0};</div><div>  double prevPos[3] = {0, 0, 0};</div><div>  </div><div>  while(true){</div><div>    double *up = camera-&gt;GetViewUp();</div><div>    double *focal = camera-&gt;GetFocalPoint();</div>


<div>    double *pos = camera-&gt;GetPosition();</div><div><br></div><div>    bool viewpointChanged = false;</div><div><br></div><div>    // Check up vector</div><div>    if(up[0] != prevUp[0] || up[1] != prevUp[1] || up[2] != prevUp[2])</div>


<div>      viewpointChanged = true;</div><div><br></div><div>    // Check focal point</div><div>    if(focal[0] != prevFocal[0] || focal[1] != prevFocal[1] || focal[2] != prevFocal[2])</div><div>      viewpointChanged = true;</div>


<div><br></div><div>    // Check position</div><div>    if(pos[0] != prevPos[0] || pos[1] != prevPos[1] || pos[2] != prevPos[2])</div><div>      viewpointChanged = true;</div><div><br></div><div>    // If the viewpoints changed get the cameras frustum</div>


<div>    if (viewpointChanged){</div><div>      prevUp[0] = up[0]; prevUp[1] = up[1]; prevUp[2] = up[2];</div><div>      prevFocal[0] = focal[0]; prevFocal[1] = focal[1]; prevFocal[2] = focal[2];</div><div>      prevPos[0] = pos[0]; prevPos[1] = pos[1]; prevPos[2] = pos[2];</div>


<div><br></div><div>      cout &lt;&lt; &quot;View Changed&quot; &lt;&lt; endl;</div><div>      cout &lt;&lt; &quot;Up: &lt;&quot; &lt;&lt; up[0] &lt;&lt; &quot;, &quot; &lt;&lt; up[1] &lt;&lt; &quot;, &quot; &lt;&lt; up[2] &lt;&lt; &quot;&gt;&quot; &lt;&lt; endl;</div>


<div>      cout &lt;&lt; &quot;Focal: &lt;&quot; &lt;&lt; focal[0] &lt;&lt; &quot;, &quot; &lt;&lt; focal[1] &lt;&lt; &quot;, &quot; &lt;&lt; focal[2] &lt;&lt; &quot;&gt;&quot; &lt;&lt; endl;</div><div>      cout &lt;&lt; &quot;Pos: &lt;&quot; &lt;&lt; pos[0] &lt;&lt; &quot;, &quot; &lt;&lt; pos[1] &lt;&lt; &quot;, &quot; &lt;&lt; pos[2] &lt;&lt; &quot;&gt;&quot; &lt;&lt; endl;</div>


<div><br></div><div>      double planes[24];</div><div>      camera-&gt;GetFrustumPlanes(1, planes);</div><div><div><br></div><div>      for (int i=0; i &lt; 6; i++){</div><div>        cout &lt;&lt; planes[(i*4)] &lt;&lt; &quot;x + &quot; &lt;&lt; planes[(i*4)+1] &lt;&lt; &quot;y + &quot; &lt;&lt; planes[(i*4)+2] &lt;&lt; &quot;z + &quot; &lt;&lt; planes[(i*4)+3] &lt;&lt; endl;</div>


<div>      }</div></div><div>    }</div><div>  }</div><div>}</div><div><br></div><div>int</div><div>main (int argc, char* argv[])</div><div>{</div><div>  vtkSmartPointer&lt;vtkRenderer&gt; renderer = vtkSmartPointer&lt;vtkRenderer&gt;::New ();</div>


<div>  vtkRenderWindowInteractor *interactor = vtkRenderWindowInteractor::New ();</div><div>  vtkSmartPointer&lt;vtkRenderWindow&gt; window = vtkSmartPointer&lt;vtkRenderWindow&gt;::New ();</div><div><br></div><div>  window-&gt;AddRenderer (renderer);</div>


<div>  window-&gt;SetSize (500, 500);</div><div>  interactor-&gt;SetRenderWindow (window);</div><div><br></div><div>  interactor-&gt;Initialize();</div><div><br></div><div>  boost::thread workerThread(workerFunc, renderer-&gt;GetActiveCamera());</div>


<div><br></div><div>  window-&gt;Render ();</div><div><br></div><div>  vtkSmartPointer&lt;vtkInteractorStyleTrackballCamera&gt; style = vtkSmartPointer&lt;vtkInteractorStyleTrackballCamera&gt;::New ();</div><div>  interactor-&gt;SetInteractorStyle (style);</div>


<div><br></div><div>  interactor-&gt;Start ();</div><div><br></div><div>  return 0;</div><div>}</div></div></div></div><div><br></div><div><br></div><div>Thanks!</div><span class="HOEnZb"><font color="#888888"><div>Justin</div>


</font></span></blockquote></div><br></div></div>