Planned maintenance has been done but it did not solve the problem. So work will continue on this and a new time for trying updates will be announced asap.
QGraphicsScene choked with updates?

I have a Worker Thread that copes with heavy and long computations (up to tenth of seconds). These computations produce several thousands of
QLines
, representing the edges of a dynamicallygrowing tree. These edges can be modified anytime, since they connect the nodes of the trees by checking the cost, represented by the distance. I would like a smooth update of theQGraphicsScene
containing the edges. I tried with signal and slots: Worker thread emits a signal, so when the buffer is full this signal gets caught by the main thread, that will cope with the update/drawing of the line
 This signal gets still caught by the main thread, but it seems it gets emitted very often, so QGraphicsView/QGraphicsScene gets choked with
QLine
to be added  Changing the size of the buffer doesn't matter
 Is there an alternative approach to this?
The main slot is:
void MainWindow::update_scene(bufferType buffer) { for (int i = 0; i < buffer.size(); ++i) { if (buffer[i].first < (g_edges.size()  1)) { delete g_edges[buffer[i].first]; g_edges[buffer[i].first] = scene>addLine(buffer[i].second); } else g_edges.push_back(scene>addLine(buffer[i].second)); } }
Note that
bufferType
is of typeQList<std::pair<int,QLine>>
. Here is the heavy computing partwhile (T.size() < max_nodes_number && !_stop) { const cnode random_node = rand_conf (); const cnode nearest_node = T.nearest_node (random_node); cnode new_node = new_conf (nearest_node, random_node); if (obstacle_free(nearest_node, new_node)) { QList<cnode*> X_near = T.neighbours (new_node, max_neighbour_radius); cnode lowest_cost_node = nearest_node; qreal c_min = nearest_node.cost() + T.distance (nearest_node, new_node); for (int j = 0; j < X_near.size(); ++j) { if (obstacle_free(*X_near[j], new_node) && ((X_near[j]>cost() + T.distance (*X_near[j], new_node)) < c_min)) { c_min = X_near[j]>cost() + T.distance (*X_near[j], new_node); lowest_cost_node = *X_near[j]; } } T.add_node (new_node, lowest_cost_node.id()); queue (new_node.id(), QLine (new_node.x(), new_node.y(), lowest_cost_node.x(), lowest_cost_node.y())); for (int j = 0; j < X_near.size(); ++j) { if (obstacle_free(*X_near[j], new_node) && (new_node.cost() + T.distance (new_node, *X_near[j])) < X_near[j]>cost()) { queue (X_near[j]>id(), QLine (new_node.x(), new_node.y(), X_near[j]>x(), X_near[j]>y())); T.update_parent (*X_near[j], new_node.id()); T.rewire_tree (X_near[j]>id()); } } } } emit finished();
Please note that
T
is a class representing aTree
. It is constituted by some methods allowing to add a node, searching for the nearest one, etc. It has aQList<cnode>
as private member, storing the tree's nodes.cnode
is a structure constituted of two coordinates, an id, a parent, a cost, a list of its children.


Hi,
Please don't post the same question multiple times. If you have additional informations to add to your thread, you can edit the post. rather than deleting it and write a new one.