[prev in list] [next in list] [prev in thread] [next in thread] 

List:       vtkusers
Subject:    Re: [vtkusers] Multi-threaded VTK
From:       Chris Volpe ARA/SED <cvolpe () ara ! com>
Date:       2011-06-27 18:47:32
Message-ID: 7B8A49496E564B4781559C6C1AEB79330890D366 () mail-west-1 ! exchange2 ! ara ! wan
[Download RAW message or body]

Well, I'm encountering strange behavior with the timer objects. It seems that the \
mere creation of a repeating timer (iren->CreateRepeatingTimer(tval)) causes the \
trackball camera interactor style to repeat the effects of the last mouse motion each \
time the timer goes off (while the mouse button is held down), even if I have not \
added an observer for this timer, for some random number of timer iterations, and \
then the aberrant behavior ceases, until the next mouse motion occurs. As a result, \
the trackball interactor style behaves a little bit like the joystick interactor \
style. I suspect this is a bug, but for now it seems that I need to kill the timer \
during a user interaction, and start it back up when the interaction has ended. \
Blech.

-Chris

From: vtkusers-bounces@vtk.org [mailto:vtkusers-bounces@vtk.org] On Behalf Of Chris \
                Volpe ARA/SED
Sent: Monday, June 27, 2011 8:10 AM
To: Shashwath T.R.
Cc: vtkusers
Subject: Re: [vtkusers] Multi-threaded VTK

The interactive thread *can't* be the primary thread of the application, because I'm \
providing a library that the primary thread of the application has to call to create \
a window, get everything set up, and then return so that the primary application \
thread can continue where it left off, generating content and doing the rest of what \
it does. However, it shouldn't matter which thread does the graphics: if I understand \
the situation correctly, all that matters is that *one* thread does *all* the \
graphics work - I can't split it between two threads. So, instead of having the \
foreground thread to periodic rendering and the background thread do the interaction, \
I need to restrict the foreground thread's activity to data-transfer only, and have \
the background thread pick up the new data in a timer callback and render it. Not a \
big deal, but it does introduce a little unwanted latency in the process (say, if the \
main thread provides new data *right after* the last timer callback determines there \
was no data change since the previous timer).

Now, if there were some way I could have the main thread generate some event that the \
interactive thread could respond to as soon as it happens, rather than waiting for a \
timer to occur, that would mitigate my latency problem. Does VTK provide support for \
doing this in a thread-safe way?

Thanks for the help.

-Chris

From: Shashwath T.R. [mailto:trshash@gmail.com]
Sent: Friday, June 24, 2011 2:58 AM
To: Chris Volpe ARA/SED
Cc: vtkusers
Subject: Re: [vtkusers] Multi-threaded VTK

Right, there are obviously good reasons to want multi-threading, but the tradeoffs \
have to be analyzed.

Like I said earlier, in any case, the interactive thread should be the primary thread \
of the application. In Windows, cross-thread GUI calls (rendering, for example), are \
undefined.

Regards,
Shash
On Thu, Jun 23, 2011 at 5:43 PM, Chris Volpe ARA/SED \
<cvolpe@ara.com<mailto:cvolpe@ara.com>> wrote: I misspoke: I said "non-rendering \
thread" when I meant "non-interactive thread"

-Chris

From: Chris Volpe ARA/SED
Sent: Thursday, June 23, 2011 7:41 AM
To: 'Shashwath T.R.'
Subject: RE: [vtkusers] Multi-threaded VTK

Using a timer was my fallback approach. I wanted to avoid it because data changes are \
going to be driven asynchronously by the non-rendering thread.

Thanks,

-Chris

From: Shashwath T.R. [mailto:trshash@gmail.com<mailto:trshash@gmail.com>]
Sent: Thursday, June 23, 2011 1:54 AM
To: Chris Volpe ARA/SED
Subject: Re: [vtkusers] Multi-threaded VTK

If you're doing this in Windows, I'd definitely suggest doing it the other way \
around; that is, run the interactor in the main thread and the updation in the worker \
thread.

Generally, in Windows, the UI cannot be touched on a cross-thread call; the thread \
that created the UI should handle it. It's always better to run the interactor in the \
main thread.

In any case, for a simple azimuth change once a second, it should be possible to \
create a timer on the interactor and do your camera management inside the timer \
callback.

Regards,
Shash
On Thu, Jun 23, 2011 at 2:11 AM, Chris Volpe ARA/SED \
<cvolpe@ara.com<mailto:cvolpe@ara.com>> wrote:

At the moment, I'm doing a very simplified version (for proof of concept) of my \
ultimate goal. The simplified version is to azimuth the camera by 10 degrees once a \
second in the main thread while showing a cone in the render window. So, no, I am not \
currently creating vtkObjects in the main thread once the background thread \
(interactor) starts..



Here's an excerpt of code from my "FeatureViewer" class. In my simplified proof of \
concept, the main program instantiates FeatureViewer and invokes the RunTest method, \
which sets everything up and spawns the background thread to run the interactor loop. \
When RunTest returns, the main program enters a loop in which it invokes \
CameraAzimuth once per second. You'll notice a couple references to a class called \
"vtkCommandDelegator" -- this is a template subclass of vtkCommand I wrote that \
allows you to specify and arbitrary method of an arbitrary class instance as the \
command callback. I wrote it because it seemed silly to have to create a new subclass \
of vtkCommand every time I want to have a callback for something.



I'll leave out the class def and just include the relevant methods for brevity.



static DWORD WINAPI ThreadCallbackFunction(LPVOID lpParameter)
{
      FeatureViewer *This = static_cast<FeatureViewer *>(lpParameter);

      // Start the render window interactor in the background
      This->InternalRunInteractor();
      return 0;
}

FeatureViewer::FeatureViewer()
{
      CS = vtkCriticalSection::New();
      pCam = NULL;
}


void FeatureViewer::LockCriticalSection(vtkObject *caller, unsigned long eventID, \
void *callData) {
      CS->Lock();
      fprintf(stderr,"Interactor about to render\n");
}

void FeatureViewer::UnlockCriticalSection(vtkObject *caller, unsigned long eventID, \
void *callData) {
      fprintf(stderr,"Interactor done rendering\n");
      CS->Unlock();

}


void FeatureViewer::RunInteractorInBackground()
{
      // Start up the thread
      LPSECURITY_ATTRIBUTES attr = NULL;
      SIZE_T stackSize = 0; // default = 1 MB
      DWORD dwCreationFlags = 0;
      LPDWORD noThreadID = NULL;

      HANDLE m_hThreadHandle = CreateThread(attr, stackSize, ThreadCallbackFunction,
            this, dwCreationFlags, noThreadID);
}

void FeatureViewer::InternalRunInteractor()
{
      // Called in background thread.
      pIRen->Initialize();
      pIRen->Start();
}



void FeatureViewer::CameraAzimuth(double rot)
{
      // Rotate camera here. Called by main thread
      CS->Lock();
      fprintf(stderr, "About to rotate camera\n");
      pCam->Azimuth(rot);
      pRenWin->Render();
      fprintf(stderr,"Done rotating camera\n");
      CS->Unlock();

}


void FeatureViewer::RunTest()

{
      vtkConeSource *cone = vtkConeSource::New();
      cone->SetHeight( 3.0 );
      cone->SetRadius( 1.0 );
      cone->SetResolution( 10 );
      vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
      coneMapper->SetInputConnection( cone->GetOutputPort() );
      vtkActor *coneActor = vtkActor::New();
      coneActor->SetMapper( coneMapper );

      pRen = vtkRenderer::New();
      pRen->AddActor( coneActor );
      pRen->SetBackground( 0.1, 0.2, 0.4 );
      pRenWin = vtkRenderWindow::New();
      pRenWin->AddRenderer( pRen );
      pRenWin->SetSize( 300, 300 );

      pIRen = vtkRenderWindowInteractor::New();
      pIRen->SetRenderWindow(pRenWin);

      vtkInteractorStyleTrackballCamera *style =
            vtkInteractorStyleTrackballCamera::New();
      pIRen->SetInteractorStyle(style);

pCam = pRen->GetActiveCamera();

      pStartInteractionCommand = vtkCommandDelegator<FeatureViewer>::New();
      pStartInteractionCommand->RegisterCallback(this, \
&FeatureViewer::LockCriticalSection);  pEndInteractionCommand = \
                vtkCommandDelegator<FeatureViewer>::New();
      pEndInteractionCommand->RegisterCallback(this, \
                &FeatureViewer::UnlockCriticalSection);
      style->AddObserver(vtkCommand::StartInteractionEvent,pStartInteractionCommand);
      style->AddObserver(vtkCommand::EndInteractionEvent, pEndInteractionCommand);



      RunInteractorInBackground();

}



Thanks,

-Chris





> -----Original Message-----

> From: Aashish Chaudhary \
> [mailto:aashish.chaudhary@kitware.com<mailto:aashish.chaudhary@kitware.com>]

> Sent: Wednesday, June 22, 2011 12:46 PM

> To: Chris Volpe ARA/SED

> Cc: vtkusers@vtk.org<mailto:vtkusers@vtk.org>

> Subject: Re: [vtkusers] Multi-threaded VTK

> 

> On Wed, Jun 22, 2011 at 12:27 PM, Chris Volpe ARA/SED \
> <cvolpe@ara.com<mailto:cvolpe@ara.com>>

> wrote:

> > I'm trying to have an application that drives scene content change on

> its

> > own, while still allowing the user to manipulate the scene with

> > vtkRenderWindowInteractor. The approach I'm trying to use is to have

> the

> > vtkRenderWindowInteractor run in a background thread, with some

> concurrency

> > protection to keep it from invoking the rendering pipeline at the

> same time

> > the main thread tries to do so. My application main thread creates

> all the

> > vtk objects (actor, render window, renderer, interactor), registers a

> couple

> > of callbacks for the interactor style's StartInteractionEvent and

> > EndInteractionEvent which lock and unlock a vtkCriticalSection,

> > respectively, and then spawns a background thread in which the

> interactor is

> > started. The main thread then, periodically, locks the critical

> section,

> > makes scene changes, renders, and unlocks the critical section.

> > 

> > 

> > 

> > Although this approach seems sound in principle, I'm encountering

> corruption

> > that leads me to believe that there is some kind of pipeline

> manipulation

> > occurring before processing the StartInteractionEvent that is

> conflicting

> > with what I'm doing in my main thread. Can someone with detailed

> knowledge

> > of pipeline bowels provide some insight as to what might be going on,

> and

> > perhaps provide an alternate course of action?

> 

> Do you produce new vtk objects in the background thread? If yes do you

> use vtkSmartPointer? That could be cause of the problem depending on

> how you are passing vtk objects from one thread to another.

> 

> Also it might help if you can attach a minimal code to reproduce the

> behavior.

> 

> Thanks

> 

> 

> > 

> > 

> > 

> > Thanks,

> > 

> > 

> > 

> > Chris

> > 

> > --

> > Christopher R. Volpe,

> > Ph.D.

> Email:

> > cvolpe@ara.com<mailto:cvolpe@ara.com>

> > 

> > Senior Scientist, Information Exploitation Systems             Main

> Desk:

> > 919-582-3300

> > 

> > Applied Research Associates,

> > Inc                                                     Direct: 919-

> 582-3380

> > 

> > 8537 Six Forks Rd., Suite

> > 6000                                                            Fax :

> > 919-582-3301

> > 

> > Raleigh, NC 27615                                         Web:

> > http://www.ara.com/offices/NC.htm

> > 

> > 

> > 

> > 

> > 

> > _______________________________________________

> > Powered by www.kitware.com<http://www.kitware.com>

> > 

> > Visit other Kitware open-source projects at

> > http://www.kitware.com/opensource/opensource.html

> > 

> > Please keep messages on-topic and check the VTK FAQ at:

> > http://www.vtk.org/Wiki/VTK_FAQ

> > 

> > Follow this link to subscribe/unsubscribe:

> > http://www.vtk.org/mailman/listinfo/vtkusers

> > 

> > 

> 

> 

> 

> --

> > Aashish Chaudhary

> > R&D Engineer

> > Kitware Inc.

> > www.kitware.com<http://www.kitware.com>

_______________________________________________
Powered by www.kitware.com<http://www.kitware.com>

Visit other Kitware open-source projects at \
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the VTK FAQ at: \
http://www.vtk.org/Wiki/VTK_FAQ

Follow this link to subscribe/unsubscribe:
http://www.vtk.org/mailman/listinfo/vtkusers


[Attachment #3 (text/html)]

<html xmlns:v="urn:schemas-microsoft-com:vml" \
xmlns:o="urn:schemas-microsoft-com:office:office" \
xmlns:w="urn:schemas-microsoft-com:office:word" \
xmlns:x="urn:schemas-microsoft-com:office:excel" \
xmlns:p="urn:schemas-microsoft-com:office:powerpoint" \
xmlns:a="urn:schemas-microsoft-com:office:access" \
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" \
xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" \
xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" \
xmlns:b="urn:schemas-microsoft-com:office:publisher" \
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" \
xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" \
xmlns:odc="urn:schemas-microsoft-com:office:odc" \
xmlns:oa="urn:schemas-microsoft-com:office:activation" \
xmlns:html="http://www.w3.org/TR/REC-html40" \
xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" \
xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" \
xmlns:Repl="http://schemas.microsoft.com/repl/" \
xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" \
xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" \
xmlns:ppda="http://www.passport.com/NameSpace.xsd" \
xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" \
xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" \
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" \
xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" \
xmlns:udc="http://schemas.microsoft.com/data/udc" \
xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" \
xmlns:ec="http://www.w3.org/2001/04/xmlenc#" \
xmlns:sp="http://schemas.microsoft.com/sharepoint/" \
xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" \
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" \
xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" \
xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" \
xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" \
xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" \
xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" \
xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" \
xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" \
xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" \
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" \
xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" \
xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" \
xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" \
xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" \
xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" \
xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" \
xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="&#1;" \
xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type \
content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 \
(filtered medium)"><style><!-- /* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
p
	{mso-style-priority:99;
	mso-margin-top-alt:auto;
	margin-right:0in;
	mso-margin-bottom-alt:auto;
	margin-left:0in;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";}
span.EmailStyle18
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.EmailStyle19
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div \
class=WordSection1><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Well, \
I&#8217;m encountering strange behavior with the timer objects. It seems that the \
mere creation of a repeating timer (iren-&gt;CreateRepeatingTimer(tval)) causes the \
trackball camera interactor style to repeat the effects of the last mouse motion each \
time the timer goes off (while the mouse button is held down), <b><i>even if I have \
not added an observer for this timer</i></b>, for some random number of timer \
iterations, and then the aberrant behavior ceases, until the next mouse motion \
occurs. As a result, the trackball interactor style behaves a little bit like the \
joystick interactor style. I suspect this is a bug, but for now it seems that I need \
to kill the timer during a user interaction, and start it back up when the \
interaction has ended. Blech.<o:p></o:p></span></p><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>-Chris<o:p></o:p></span></p></div><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div \
style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'><div><div \
style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p \
class=MsoNormal><b><span \
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span \
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> vtkusers-bounces@vtk.org \
[mailto:vtkusers-bounces@vtk.org] <b>On Behalf Of </b>Chris Volpe \
ARA/SED<br><b>Sent:</b> Monday, June 27, 2011 8:10 AM<br><b>To:</b> Shashwath \
T.R.<br><b>Cc:</b> vtkusers<br><b>Subject:</b> Re: [vtkusers] Multi-threaded \
VTK<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><p \
class=MsoNormal>The interactive thread *<b>can&#8217;t</b>* be the primary thread of \
the application, because I&#8217;m providing a library that the primary thread of the \
application has to call to create a window, get everything set up, and then return so \
that the primary application thread can continue where it left off, generating \
content and doing the rest of what it does. However, it shouldn&#8217;t matter which \
thread does the graphics: if I understand the situation correctly, all that matters \
is that *<b>one</b>* thread does *<b>all</b>* the graphics work &#8211; I can&#8217;t \
split it between two threads. So, instead of having the foreground thread to periodic \
rendering and the background thread do the interaction, I need to restrict the \
foreground thread&#8217;s activity to data-transfer only, and have the background \
thread pick up the new data in a timer callback and render it. Not a big deal, but it \
does introduce a little unwanted latency in the process (say, if the main thread \
provides new data *<b>right after</b>* the last timer callback determines there was \
no data change since the previous timer).<o:p></o:p></p><p \
class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>Now, if there were some way I \
could have the main thread <i>generate some event</i> that the interactive thread \
could respond to as soon as it happens, rather than waiting for a timer to occur, \
that would mitigate my latency problem. Does VTK provide support for doing \
<i>this</i> in a thread-safe way?<o:p></o:p></p><p \
class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>Thanks for the help. \
<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p \
class=MsoNormal>-Chris<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><div \
style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'><div><div \
style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p \
class=MsoNormal><b>From:</b> Shashwath T.R. [mailto:trshash@gmail.com] \
<br><b>Sent:</b> Friday, June 24, 2011 2:58 AM<br><b>To:</b> Chris Volpe \
ARA/SED<br><b>Cc:</b> vtkusers<br><b>Subject:</b> Re: [vtkusers] Multi-threaded \
VTK<o:p></o:p></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><p \
class=MsoNormal style='margin-bottom:12.0pt'>Right, there are obviously good reasons \
to want multi-threading, but the tradeoffs have to be analyzed.<br><br>Like I said \
earlier, in any case, the interactive thread should be the primary thread of the \
application. In Windows, cross-thread GUI calls (rendering, for example), are \
undefined.<br><br>Regards,<br>Shash<o:p></o:p></p><div><p class=MsoNormal>On Thu, Jun \
23, 2011 at 5:43 PM, Chris Volpe ARA/SED &lt;<a \
href="mailto:cvolpe@ara.com">cvolpe@ara.com</a>&gt; wrote:<o:p></o:p></p><div><div><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>I misspoke: I said &#8220;non-rendering \
thread&#8221; when I meant &#8220;non-interactive \
thread&#8221;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p><div><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>-Chris</span><o:p></o:p></p></div><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p><div \
style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'><div><div \
style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span \
style='font-size:10.0pt'>From:</span></b><span style='font-size:10.0pt'> Chris Volpe \
ARA/SED <br><b>Sent:</b> Thursday, June 23, 2011 7:41 AM<br><b>To:</b> 'Shashwath \
T.R.'<br><b>Subject:</b> RE: [vtkusers] Multi-threaded \
VTK</span><o:p></o:p></p></div></div><div><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>Using a timer was my fallback approach. I \
wanted to avoid it because data changes are going to be driven asynchronously by the \
non-rendering thread.</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>Thanks,</span><o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>-Chris</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span \
style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p></div><div \
style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'><div><div \
style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><b><span \
style='font-size:10.0pt'>From:</span></b><span style='font-size:10.0pt'> Shashwath \
T.R. [mailto:<a href="mailto:trshash@gmail.com" \
target="_blank">trshash@gmail.com</a>] </span><o:p></o:p></p><div><p \
class=MsoNormal><b>Sent:</b> Thursday, June 23, 2011 1:54 \
AM<o:p></o:p></p></div><div><p class=MsoNormal><b>To:</b> Chris Volpe \
ARA/SED<o:p></o:p></p></div><div><div><p class=MsoNormal><b>Subject:</b> Re: \
[vtkusers] Multi-threaded VTK<o:p></o:p></p></div></div></div></div><div><div><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;margin-bottom:12.0pt'>If you're doing \
this in Windows, I'd definitely suggest doing it the other way around; that is, run \
the interactor in the main thread and the updation in the worker \
thread.<br><br>Generally, in Windows, the UI cannot be touched on a cross-thread \
call; the thread that created the UI should handle it. It's always better to run the \
interactor in the main thread.<br><br>In any case, for a simple azimuth change once a \
second, it should be possible to create a timer on the interactor and do your camera \
management inside the timer callback.<br><br>Regards,<br>Shash<o:p></o:p></p><div><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Thu, \
Jun 23, 2011 at 2:11 AM, Chris Volpe ARA/SED &lt;<a href="mailto:cvolpe@ara.com" \
target="_blank">cvolpe@ara.com</a>&gt; wrote:<o:p></o:p></p><div><div><p>At the \
moment, I'm doing a very simplified version (for proof of concept) of my ultimate \
goal. The simplified version is to azimuth the camera by 10 degrees once a second in \
the main thread while showing a cone in the render window. So, no, I am not currently \
creating vtkObjects in the main thread once the background thread (interactor) \
starts..<o:p></o:p></p><p>&nbsp;<o:p></o:p></p><p>Here's an excerpt of code from my \
&quot;FeatureViewer&quot; class. In my simplified proof of concept, the main program \
instantiates FeatureViewer and invokes the RunTest method, which sets everything up \
and spawns the background thread to run the interactor loop. When RunTest returns, \
the main program enters a loop in which it invokes CameraAzimuth once per second. \
You'll notice a couple references to a class called &quot;vtkCommandDelegator&quot; \
-- this is a template subclass of vtkCommand I wrote that allows you to specify and \
arbitrary method of an arbitrary class instance as the command callback. I wrote it \
because it seemed silly to have to create a new subclass of vtkCommand every time I \
want to have a callback for \
something.<o:p></o:p></p><p>&nbsp;<o:p></o:p></p><p>I&#8217;ll leave out the class \
def and just include the relevant methods for \
brevity.<o:p></o:p></p><p>&nbsp;<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>static \
<span style='color:#030003'>DWORD</span> <span style='color:#030003'>WINAPI</span> \
<span style='color:#030003'>ThreadCallbackFunction</span>(<span \
style='color:#030003'>LPVOID</span> <span \
style='color:#030003'>lpParameter</span>)<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>{<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>FeatureViewer</span> *<span \
style='color:#030003'>This</span> = <span \
style='color:blue'>static_cast</span>&lt;<span \
style='color:#030003'>FeatureViewer</span> *&gt;(<span \
style='color:#030003'>lpParameter</span>);<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:green'>// Start the render window interactor in the \
background</span><o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>This</span>-&gt;<span \
style='color:#030003'>InternalRunInteractor</span>();<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:blue'>return</span> 0;<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>}<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>FeatureViewer::<span \
style='color:#030003'>FeatureViewer</span>()<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>{<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>CS</span> = <span \
style='color:#030003'>vtkCriticalSection</span>::<span \
style='color:#030003'>New</span>();<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>pCam</span> = <span \
style='color:#030003'>NULL</span>;<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>}<o:p></o:p></p><p>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>void \
<span style='color:#030003'>FeatureViewer</span>::<span \
style='color:#030003'>LockCriticalSection</span>(<span \
style='color:#030003'>vtkObject</span> *<span style='color:#030003'>caller</span>, \
<span style='color:blue'>unsigned</span> <span style='color:blue'>long</span> <span \
style='color:#030003'>eventID</span>, <span style='color:blue'>void</span> *<span \
style='color:#030003'>callData</span>)<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>{<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>CS</span>-&gt;<span \
style='color:#030003'>Lock</span>();<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>fprintf</span>(<span \
style='color:#030003'>stderr</span>,<span style='color:#A31515'>&quot;Interactor \
about to render\n&quot;</span>);<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>}<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>void \
<span style='color:#030003'>FeatureViewer</span>::<span \
style='color:#030003'>UnlockCriticalSection</span>(<span \
style='color:#030003'>vtkObject</span> *<span style='color:#030003'>caller</span>, \
<span style='color:blue'>unsigned</span> <span style='color:blue'>long</span> <span \
style='color:#030003'>eventID</span>, <span style='color:blue'>void</span> *<span \
style='color:#030003'>callData</span>)<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>{<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>fprintf</span>(<span \
style='color:#030003'>stderr</span>,<span style='color:#A31515'>&quot;Interactor done \
rendering\n&quot;</span>);<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
<span style='color:#030003'>CS</span>-&gt;<span \
style='color:#030003'>Unlock</span>();<o:p></o:p></p><p>}<o:p></o:p></p><p>&nbsp;<o:p></o:p></p><p \
class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'>void \
<span style='color:#030003'>FeatureViewer</span>::<span \



_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ

Follow this link to subscribe/unsubscribe:
http://www.vtk.org/mailman/listinfo/vtkusers

--===============1691802389==--

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic