J'ai un BusyIndicator qui doit tourner pendant les calculs lourds et s'arrêter lorsque les calculs sont terminés. Je pensais WorkerScript était la bonne voie à suivre mais from here, il semble que le secondaire (thread de calcul) dans le fichier .js n'a pas accès aux objets du thread primaire .qml.Accès WorkerScript à la classe Contrôleur
Ceci est problématique car tous mes calculs sont effectués via un QObject défini par le contrôleur C++ instancié par le thread primaire.
Voici mon code:
main.qml
import QtQuick 2.7
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Controls.Material 2.0
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.2
import LcQml 1.0
ApplicationWindow
{
id: window
UiController
{
id: uiController
}
WorkerScript
{
id: importScanWorkerScript
source: "importScanWorkerScript.js"
onMessage:
{
busyIndicator.running = false;
}
}
FileDialog
{
id: importScanDialog
visible: false
title: "Import a [scan] file"
folder: "MyScannedScenesFolder"
nameFilters: [ "STL files (*stl)" ]
selectedNameFilter: "STL files (*stl)"
onAccepted:
{
importScanWorkerScript.sendMessage({'filepath': importScanDialog.fileUrl})
busyIndicator.running = true;
}
}
BusyIndicator
{
id: busyIndicator
running: false
anchors.centerIn: parent
}
}
importScanWorkerScript.js
WorkerScript.onMessage = function(message)
{
uiController.onImportScanDevMenuClicked(message.filepath);
WorkerScript.sendMessage()
}
Pb: uiController ne définit pas importScanWorkerScrip t.js. Dois-je comprendre que WorkerScript ne peut gérer que des situations simples?
Avec votre proposition, la uiController.doSomething() et uiController.doSomethingAnother() sont traités dans le thread d'interface utilisateur, pas ? Dans mon cas, il s'avère que uiController.doSomething() et uiController.doSomethingAnother() sont les fonctions lourdes réelles qui devraient être l'ordinateur dans le fil d'arrière-plan ... – arennuit
Ah, ok, maintenant je le vois. La meilleure approche consiste à exécuter la tâche lourde à l'aide de QThread dans le code C++. Il n'y a aucun sens à exécuter une tâche C++ avec du code Javascript, bien que vous ne puissiez pas passer votre objet dans WorkerScript. – folibis
Je ne suis pas sûr de comprendre que le chier WorkerScript est utile pour ... Qui veut effectuer une commutation lourde en js? En tout cas merci beaucoup pour votre aide! – arennuit