QThreading eines großen QGraphicsView
Verfasst: 14. Oktober 2009 16:26
Hallo Forum,
ich habe ein ziemlich großes QGraphicsView (bis zu ca. 100.000 Items), welches ich asynchron updaten möchte. Ereignisse, bei denen das Update auftreten soll, sind z.B. Mouse-Events u.ä. (Cursor verschieben).
Also gibt es bei mir einen eigenen QThread, der u.a. folgendes macht:
Das crasht immer mal im setBrush() mit verschiedenen Meldungen (Segfault, double free, ...).
Ich vermute, dass das daran liegt, dass man die Objekte immer nur in ihrem "eigenen" Thread behandeln darf.
Also zu Beginn noch ein "scene.moveToThread(...)" eingebaut.
Das hilft aber nicht. Die einzelnen Items (QGraphicsRectItem) sind jedoch nicht von QObject abgeleitet (warum eigentlich nicht?), sodass ich dort moveToThread() nicht aufrufen kann.
Wie kann ich nun ein asynchrones Update der Map hinbekommen? Ich möchte es nicht im Haupt-Gui-Thread machen, da dann für die Zeit des Updates (einige Sekunden) die Oberfläche blockiert ist, was gerade bei der Verschiebung eines Mauscursors (welches das Update hervorruft) sehr störend wirken würde.
Viele Grüße
olebole
ich habe ein ziemlich großes QGraphicsView (bis zu ca. 100.000 Items), welches ich asynchron updaten möchte. Ereignisse, bei denen das Update auftreten soll, sind z.B. Mouse-Events u.ä. (Cursor verschieben).
Also gibt es bei mir einen eigenen QThread, der u.a. folgendes macht:
Code: Alles auswählen
for item in my_items:
item.setBrush(QtGui.Brush(QtGui.QColor(...)))
scene.update()
Ich vermute, dass das daran liegt, dass man die Objekte immer nur in ihrem "eigenen" Thread behandeln darf.
Also zu Beginn noch ein "scene.moveToThread(...)" eingebaut.
Das hilft aber nicht. Die einzelnen Items (QGraphicsRectItem) sind jedoch nicht von QObject abgeleitet (warum eigentlich nicht?), sodass ich dort moveToThread() nicht aufrufen kann.
Wie kann ich nun ein asynchrones Update der Map hinbekommen? Ich möchte es nicht im Haupt-Gui-Thread machen, da dann für die Zeit des Updates (einige Sekunden) die Oberfläche blockiert ist, was gerade bei der Verschiebung eines Mauscursors (welches das Update hervorruft) sehr störend wirken würde.
Viele Grüße
olebole