Accès WorkerScript à la classe Controller

J’ai un BusyIndicator qui devrait tourner pendant les calculs lourds et s’arrêter lorsque les calculs sont faits.

Je pensais que WorkerScript était la bonne solution, mais à partir de là , il semble que le secondaire (fil de calcul) du fichier .js n’ait pas access aux objects du fil de travail principal.

Cela pose problème car tous mes calculs sont effectués via un QObject défini par le contrôleur C ++ instancié par le thread principal.

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 n’est pas défini dans importScanWorkerScript.js .

Dois-je comprendre que WorkerScript ne peut gérer que des situations simples?

Comme vous l’avez déjà remarqué, WorkerScript ne peut pas accéder aux contrôles de l’interface utilisateur. Mais votre fil séparé peut “parler” au fil principal de l’interface utilisateur à l’aide de messages. Quant à moi, cela fonctionne exactement comme dans tous les autres langages / frameworks. Envoyez simplement un message à partir du fil de discussion lorsque vous souhaitez mettre à jour l’interface utilisateur ou votre object. Par exemple:

 WorkerScript.onMessage = function(message) { WorkerScript.sendMessage({ 'action': 'start' }) // do some heavy task here WorkerScript.sendMessage({ 'action': 'finish', 'data': somedata }) } 

et ainsi votre qml principal peut ressembler à ceci:

 WorkerScript { id: myWorker source: "func.js" onMessage: { switch(messageObject.action) { case 'start': spinner.running = true; uiController.doSomething(); break; case 'finish': spinner.running = false; uiController.doSomethingAnother(); break; } } }