Аргументы, переданные в источник WorkerScript

Мне нужно загрузить документы, путь к которым предоставляется FileDialog. Документ довольно длинный для загрузки, поэтому я хочу отображать BusyIndicator при загрузке документов. Чтобы UI вращался при загрузке моего документа, мне нужно загрузить мои документы в WorkerScript. Теперь мне нужно указать мой путь к функциям в файле .js, на который указывает WorkerScript :: source. Я не мог найти способ сделать это.

Любая идея?

Вот мой исходный код:

WorkerScript
{
    id: importScanWorkerScript
    source: "script.js"
}

FileDialog
{
    id: importScanDialog
    visible: false
    title: "Import a [scan] file"
    folder: "/home/arennuit/Desktop/living_room_traj0n_scannedScene"
    nameFilters: [ "STL files (*stl)" ]
    selectedNameFilter: "STL files (*stl)"
    onAccepted:
    {
        importScanDialog.visible = false;
        busyIndicator.running = true;
        uiController.onImportScanDevMenuClicked(importScanDialog.fileUrl);
        busyIndicator.running = false;
    }
}

BusyIndicator
{
    id: busyIndicator
    running: false
    anchors.centerIn: parent
}

person arennuit    schedule 16.08.2017    source источник


Ответы (1)


WorkerScript позволяет отправлять настраиваемый объект в поток, а также получать обратно настраиваемый объект, я думаю, документация довольно ясна. Итак, ответ на ваш вопрос: WorkerScript.sendMessage () . В простом примере ниже WorkerScript получает случайное количество итераций от main.qml и, таким образом, генерирует и отправляет обратно сгенерированный текст, отображаемый main.qml. Графический интерфейс не зависает во время ожидания:

main.qml

import QtQuick 2.9
import QtQuick.Window 2.0
import QtQuick.Controls 2.2

Window {
    id: window
    width: 600
    height: 400
    visible: true

    ScrollView {
        id: view
        anchors.fill: parent
        clip: true
        TextArea {
            id: myText
            text: ""
            enabled: false
        }
    }
    Component.onCompleted: {
        var cnt = 1000 + Math.round(Math.random() * 1000);
        myText.text = "Please wait, generating text (" + cnt + " characters) ...";
        myWorker.sendMessage({count: cnt});
    }

    WorkerScript {
        id: myWorker
        source: "script.js"
        onMessage: {
            myText.text = messageObject.reply;
            myText.enabled = true;
            spinner.running = false;
        }
    }

    BusyIndicator {
        id: spinner
        anchors.centerIn: parent
        running: true
    }
}

script.js

function pause(millis)
{
    var date = new Date();
    var curDate = null;
    do { 
        curDate = new Date(); 
    } while((curDate - date) < millis);
}

WorkerScript.onMessage = function(message) {
    var txt = "";
    var count = message.count;
    for(var i = 0;i < count;i ++)
    {
        var ch = 97 + Math.round(Math.random() * 25);
        txt += String.fromCharCode(ch);
        var eol = Math.round(Math.random() * 30);
        if(eol === 1)
            txt += "\r\n";
        else if(!(eol % 5))
            txt += " ";
        pause(10);
    }
    WorkerScript.sendMessage({ 'reply': txt })
}
person folibis    schedule 17.08.2017
comment
Я действительно не понимаю, вторичный поток создается, но из здесь кажется, что он не может получить доступ к свойствам, методам и атрибутам элемента QML (и мне удалось дважды проверить это в моем коде). Мой контроллер - это C ++ QObject, импортированный в контексте основного потока (поскольку все мои вычисления происходят на C ++). В чем смысл вторичного потока, если я не могу получить доступ к своему контроллеру? Думаю, я кое-что упустил ... - person arennuit; 18.08.2017
comment
Вы ответили на первый вопрос. Я написал более конкретный вопрос для доступа к контроллеру. - person arennuit; 19.08.2017