[Qt-interest] QGraphicsView QThread
Bas Terwijn
B.Terwijn at uva.nl
Tue Mar 31 21:05:06 CEST 2009
Thanks Alexis,
I now found a way to create (derived) QGraphicsItem objects in a QThread
and then move them to the main thread using:
QObject::moveToThread(QApplication::instance()->thread());
This, together with using signals in QThread to notify the main thread
to update a QGraphicsItem object (instead of updating in the QTheard),
provides a stable solution. So now I can have all my "simulator" code
create and and manipulate QGraphicsItem objects in a QThread and have
the main thread take care of all the visualization.
For those who are interested, see the attachment.
greetings,
Bas Terwijn
Alexis Ménard wrote:
> On Tuesday 31 March 2009 18:09:39 Bas Terwijn wrote:
> > hi Fred, Alexis
> >
> > First of all, thanks for your interest.
> >
> > I tried the solution offered by Alexis. It seems to be stable. Instead
> > of calling the QGraphicsItem:setPos() in the QThread after each change,
> > i now send for each item a signal to a newly created slot of each item
> > that then calls setPose() which is now done in the main thread.
> >
> > However, in my old test I created the objects derived from QGraphicsItem
> > in the main thread, if I now create items and connect their signal in
> > the QThread it is again unstable.
>
>
> As soon as you don't call methods of QGraphicsItem from your other
> thread it will works. But if you want to add members, methods on top
> of QGraphicsItem that you want to modify from your thread then the
> standard thread way of programming apply, you should protect the
> access to your new variable. As soon as you protect your stuff and
> don't use method of QGI from your thread then it should work.
>
>
> >
> > To give some background, what i want is the following. Say i am
> > developing some simulation program. For debugging purposes I would like
> > to visualize and manually manipulate it. For this I thought I use Qt.
> > But in the end I also want to run my simulation without any Qt
> > libraries. So I would like to be able to build the simulator both with
> > and without Qt, use Qt as an add-on so to say. However, Qt imposes
> > architectural constraints onto my simulation program. As Qt demands
> > complete control over the main thread, I have to run the simulator in a
> > QThread when compiling with Qt. Creating and changing the elements to be
> > visualized (object derived from QGraphicsItem) in this thread is now my
> > main problem. My simulation program should not be aware if it is running
> > with or without QT so i can use a simple macro that indicates the use of
> > Qt or not.
> >
>
>
> Then i don't think that will match here. If it is a simulation and Qt
> only a representation, what is the problem if the simulator run in a
> separate standard thread? And if you have Qt, then in a QThread.
>
>
> > So here is my refined question:
> >
> > How can I *create* and update (derived) QGraphicsItems in a QThread
> > that are to be visualized in a QGraphicsView in the main thread?
>
>
> You can't. That is not possible in any way. Since the QGraphicsView
> might crash if the item has been created/updated from a different
> thread. What you can do is what i said before is to add you stuff on
> top of, create the QGI in the main thread, protect the new data you
> want to call from your other thread but in any case don't call QGV/QGI
> method from the worker thread.
>
>
> >
> > kind regards,
> > Bas Terwijn
> >
> > Alexis Ménard wrote:
> > > On Monday 30 March 2009 18:03:27 Bas Terwijn wrote:
> > > > hi all,
> > > >
> > > > I am trying for some time to use QGraphicsView in a multi-threaded
> > > > application where in the main thread I create an QGraphicsView
> object
> > > > and run the event loop while in a seperate QThread I create and and
> > > > change many QGraphicsItems that are to be visualized in the main
> > > > thread. For thread safety I use a mutex to synchronize the
> (overloaded)
> > > > QGraphicsView::update() method and all changes to the
> QGraphicsItems.
> > > >
> > > > My approach doesn't work. I find that the QGraphicsView doesn't
> update,
> > > > even when I send signals which I think should start the
> > > > QGraphicsView::updateScene() from the main thread. I also experience
> > > > core dumps.
> > > >
> > > > Did anybody find a way to use QGraphicsView to visualize
> QGraphicsItems
> > > > that are changed by a seperate QThread?
> > > >
> > > > Thank you for your time,
> > > > Bas Terwijn
> > >
> > > It won't work...QGraphicsView framework is not thread safe. So you
> > > can't call any functions from your separate thread, it might crash.
> > > But what is the point to do the changes into your thread, can't your
> > > thread emit a signal when it finish to compute and then the main
> > > thread change the item itself?
> > >
> > > > _______________________________________________
> > > > Qt-interest mailing list
> > > > Qt-interest at trolltech.com
> > > > http://lists.trolltech.com/mailman/listinfo/qt-interest
> > >
> > > --
> > >
> > > Alexis Ménard
> > > Software Engineer, Widgets Team 1
> > > Qt Software, Nokia Norge AS, Sandakerveien 116, 0484 Oslo, Norway
> > >
> ------------------------------------------------------------------------
> > >
> > > _______________________________________________
> > > Qt-interest mailing list
> > > Qt-interest at trolltech.com
> > > http://lists.trolltech.com/mailman/listinfo/qt-interest
>
> --
>
> Alexis Ménard
> Software Engineer, Widgets Team 1
> Qt Software, Nokia Norge AS, Sandakerveien 116, 0484 Oslo, Norway
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090331/b89fb07c/attachment.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: GraphicsScene.tar.gz
Type: application/x-gzip
Size: 4817 bytes
Desc: not available
Url : http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090331/b89fb07c/attachment.gz
More information about the Qt-interest-old
mailing list