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 :
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é :
grender.loadFile(statsFilePath);
En très simplifié le graphique est représenté par une classe C++ qui dérive de QQuickPaintedItem :
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 :
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
Partager