[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="" \
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’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), <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> </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> </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> </o:p></p><p \
class=MsoNormal>The interactive thread *<b>can’t</b>* 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 *<b>one</b>* thread does *<b>all</b>* 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 *<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> </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> </o:p></p><p class=MsoNormal>Thanks for the help. \
<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p \
class=MsoNormal>-Chris<o:p></o:p></p><p class=MsoNormal><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><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> </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 <<a \
href="mailto:cvolpe@ara.com">cvolpe@ara.com</a>> 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 “non-rendering \
thread” when I meant “non-interactive \
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'> </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'> </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'> <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'> </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'> </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'> </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'> <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 <<a href="mailto:cvolpe@ara.com" \
target="_blank">cvolpe@ara.com</a>> 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> <o:p></o:p></p><p>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.<o:p></o:p></p><p> <o:p></o:p></p><p>I’ll leave out the class \
def and just include the relevant methods for \
brevity.<o:p></o:p></p><p> <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'>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'> \
<span style='color:#030003'>FeatureViewer</span> *<span \
style='color:#030003'>This</span> = <span \
style='color:blue'>static_cast</span><<span \
style='color:#030003'>FeatureViewer</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'> \
<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'> \
<span style='color:#030003'>This</span>-><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'> \
<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'> <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'> \
<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'> \
<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> <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'> \
<span style='color:#030003'>CS</span>-><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'> \
<span style='color:#030003'>fprintf</span>(<span \
style='color:#030003'>stderr</span>,<span style='color:#A31515'>"Interactor \
about to render\n"</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'> <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'> \
<span style='color:#030003'>fprintf</span>(<span \
style='color:#030003'>stderr</span>,<span style='color:#A31515'>"Interactor done \
rendering\n"</span>);<o:p></o:p></p><p class=MsoNormal \
style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;text-autospace:none'> \
<span style='color:#030003'>CS</span>-><span \
style='color:#030003'>Unlock</span>();<o:p></o:p></p><p>}<o:p></o:p></p><p> <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