Bonjour à tous,
j'ai hérité d'un code C++/QML qui affiche un graphique. Ce graphique est construit via des données sur le disque et le traitement des dites données est assez long et donc bloque l'ui.

J'aimerais amélioré ca en threadant le chargement des données, mais dès lors que j'ajoute mon thread QT n'est pas content puisque l'objet est créer sur le threadUI par QML mais les données sont chargées dans un autres thread.

Dans mon QML j'ai :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
GraphRender {
	id: grender
	anchors.left: parent.left
	anchors.top: displayModeSelection.bottom
	anchors.right: parent.right
	anchors.bottom: bottomBarRectangle.top
	visible: root.displayMode == "graph"
 
	onGraphModelChanged        {
                root.graphDataLoaded = true
        }
}
Sur le clic d'un bouton le chargement des données est appelé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
grender.loadFile(statsFilePath);
En très simplifié le graphique est représenté par une classe C++ qui dérive de QQuickPaintedItem :
Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
class GraphRender : public QQuickPaintedItem
        {
            Q_OBJECT
 
            Q_PROPERTY(QQmlListProperty<prynel::ui::GraphModel> graphModel READ getGraphModel NOTIFY graphModelChanged)
 
            public:
 
                Q_INVOKABLE void loadFile(QString filepath);
        };

loadFile() se présente ainsi :

Code Qt : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
void GraphRender::loadFile(QString filepath)
{
    // Ouverture fichier
    // Parsage fichier + création données  <== prend quelque secondes
   emit update(); // déclenche un redessin
   emit graphModelChanged();
}

Quand je thread loadFile() j'ai au mieux une erreur
Cannot create children for a parent that is in a different thread
et au pire un crash de QMLEngine.

Comment dois je procéder pour pouvoir charger mes données sans bloquer l'UI et en redessinant une fois que tout est dispo ?

note : mon niveau de QT est proche du grand débutant