I replied prematurely without realizing the currentThreadId() is a static method. So have you changed the "connect" to use a queued connection or not?
Utkarsh On Thu, Mar 10, 2011 at 8:05 AM, Utkarsh Ayachit <[email protected]> wrote: > If you look at http://doc.qt.nokia.com/latest/qobject.html#thread > > you'll see that QObject::thread() returns the thread to which the > object belongs, not the thread in which the code is being executed. > > Utkarsh > > On Thu, Mar 10, 2011 at 12:35 AM, Stephan Rogge > <[email protected]> wrote: >> Hello Utkarsh, >> >> thank you very much for the quick response and thanks for pointing me >> on the QThread documentation. Regarding to the QT doc I realized a >> direct connection here, which leads to an immediately processing of >> Trigger(). >> >> Well, my assumption was indeed wrong. So I went back to my code and >> include some debug outputs to clarify which thread processes the >> pqMyApplicationStarter::Trigger() method. In order to get these >> information I output the current thread Ids of my plugin (in >> onStartup and Trigger) ... >> >> void pqMyApplicationStarter::onStartup() >> { >> ... >> qWarning() << "Message from pqMyApplicationStarter: >> Application Started >> (" << this->thread()->currentThreadId() << ")"; >> >> } >> >> void pqMyApplicationStarter:: Trigger() >> { >> ... >> qWarning() << "pqMyApplicationStarter::Trigger(): >> " << this->thread()->currentThreadId(); >> >> } >> >> and in my external thread (Thread::run). >> >> void Thread::run() >> { >> running = true; >> >> while( running ) >> { >> qWarning() << "Thread::run(): " << >> currentThreadId(); >> >> // Fire the signal >> emit UpdatedData(); >> >> qWarning() << "Invocation done"; >> } >> } >> >> This lead to the following output: >> >> Message from pqMyApplicationStarter: Application Started ( 0x1514 ) >> Thread::run(): 0x123c >> pqMyApplicationStarter::Trigger(): 0x1514 >> Invocation done >> >> And here I a new question arises: It seems to be, that Trigger is >> invoked in my external thread and waits for return but is processed >> in the plugin thread. Is that right? >> >> >> Thanks again, >> >> Best regards, >> Stephan >> >> >> -----Ursprüngliche Nachricht----- >> Von: Utkarsh Ayachit [mailto:[email protected]] >> Gesendet: Mittwoch, 9. März 2011 17:25 >> An: Stephan Rogge >> Cc: [email protected] >> Betreff: Re: [Paraview] Plugin with own thread >> >> You might want to read >> http://doc.qt.nokia.com/latest/threads-qobject.html especially the >> section about signal/slots and threads. >> >> In your code, contrary to what you expect, Trigger() is being called >> in your thread and not the "main thread" and hence the issues you >> might be seeing. If you simply change the connection to use a >> Qt::QueuedConnection you'd get the desired effect. >> >> Utkarsh >> >> On Wed, Mar 9, 2011 at 8:10 AM, Stephan Rogge >> <[email protected]> wrote: >>> Hello, >>> >>> >>> >>> after reading the tutorials and How-to’s for writing ParaView Plugins I’ve >>> started with the Autostart-Example project. My goal was to create a plugin >>> which is executed in an external thread. It might happens that I need this >>> in the near future. >>> >>> >>> >>> Well, it works quit well, I guess. But to avoid some errors and >>> miss-behaviors I need a confirmation that I am on the right way. >>> >>> >>> >>> My approach is to use the signal-slot-pattern to communicate between the >>> main thread of ParaView and my own plugin-thread. The class >>> pqMyApplicationStarter represents the ParaView-plugin (which is running in >>> the main thread of ParaView?). There is an object in this class which >>> executes a loop within an external thread ( class Thread ), which extends >>> QThread. >>> >>> >>> >>> As I read somewhere that vtk isn’t implemented threaded-safe at all (at >>> least the rendering stuff) I decided to do all render calls in >>> pqMyApplicationStarter. When the UpdatedData()signal is fired the active >>> view needs to re-rendered. >>> >>> >>> >>> The question I want to ask is very simple: Is this the right / best way to >>> create a thread and communicate with it via signals? >>> >>> >>> >>> >>> >>> /////////////// Thread.h //////////////////////////// >>> >>> class Thread : public QThread >>> >>> { >>> >>> Q_OBJECT >>> >>> public: >>> >>> Thread(QObject* parent = 0); >>> >>> virtual ~Thread(); >>> >>> virtual void run(); >>> >>> signals: >>> >>> void UpdatedData(); >>> >>> }; >>> >>> >>> >>> >>> >>> >>> >>> void Thread::run() >>> >>> { >>> >>> running = true; >>> >>> >>> >>> while( running ) >>> >>> { >>> >>> // Sleep awhile >>> >>> msleep( 800 ); >>> >>> // Fire the signal >>> >>> emit UpdatedData(); >>> >>> } >>> >>> } >>> >>> ///////////////////////////////////////////////////// >>> >>> >>> >>> >>> >>> /////////////// pqMyApplicationStarter ////////////// >>> >>> class pqMyApplicationStarter : public QObject >>> >>> { >>> >>> Q_OBJECT >>> >>> typedef QObject Superclass; >>> >>> >>> >>> public: >>> >>> pqMyApplicationStarter(QObject* p=0); >>> >>> ~pqMyApplicationStarter(); >>> >>> >>> >>> // Callback for startup. >>> >>> void onStartup(); >>> >>> >>> >>> public slots: >>> >>> void Trigger(); >>> >>> }; >>> >>> >>> >>> >>> >>> >>> >>> void pqMyApplicationStarter::onStartup() >>> >>> { >>> >>> myThread = new Thread(); >>> >>> myThread->start(); >>> >>> >>> >>> pqActiveObjects::instance().connect( myThread, >> SIGNAL(UpdatedData()), >>> this, SLOT(Trigger()) ); >>> >>> } >>> >>> >>> >>> void pqMyApplicationStarter::Trigger() >>> >>> { >>> >>> pqActiveObjects* object = &(pqActiveObjects::instance()); >>> >>> pqView* view = object->activeView(); >>> >>> >>> >>> if (view) >>> >>> { >>> >>> view->render(); >>> >>> } >>> >>> >>> >>> view = NULL; >>> >>> } >>> >>> >>> >>> >>> >>> Thanks a lot. >>> >>> >>> >>> Cheers, >>> >>> Stephan >>> >>> >>> >>> _______________________________________________ >>> 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 ParaView Wiki at: >>> http://paraview.org/Wiki/ParaView >>> >>> Follow this link to subscribe/unsubscribe: >>> http://www.paraview.org/mailman/listinfo/paraview >>> >>> >> >> _______________________________________________ >> 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 ParaView Wiki at: >> http://paraview.org/Wiki/ParaView >> >> Follow this link to subscribe/unsubscribe: >> http://www.paraview.org/mailman/listinfo/paraview >> > _______________________________________________ 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 ParaView Wiki at: http://paraview.org/Wiki/ParaView Follow this link to subscribe/unsubscribe: http://www.paraview.org/mailman/listinfo/paraview
