Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WorkerScript对控制器类的访问_C++_Qt_Qml_Qtquick2_Qtquickcontrols2 - Fatal编程技术网

C++ WorkerScript对控制器类的访问

C++ WorkerScript对控制器类的访问,c++,qt,qml,qtquick2,qtquickcontrols2,C++,Qt,Qml,Qtquick2,Qtquickcontrols2,我有一个BusyIndicator,它应该在繁重的计算发生时旋转,在计算完成时停止 我认为WorkerScript是正确的方法,但是,似乎.js文件中的次要线程(计算线程)没有访问主要.qml线程对象的权限 这是个问题,因为所有的计算都是通过一个由主线程实例化的控制器C++对象来执行的。 这是我的密码: main.qml import QtQuick 2.7 import QtQuick.Layouts 1.3 import QtQuick.Window 2.2 import QtQuick.C

我有一个BusyIndicator,它应该在繁重的计算发生时旋转,在计算完成时停止

我认为WorkerScript是正确的方法,但是,似乎.js文件中的次要线程(计算线程)没有访问主要.qml线程对象的权限

<>这是个问题,因为所有的计算都是通过一个由主线程实例化的控制器C++对象来执行的。 这是我的密码:

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:importScanWorkerScript.js中未定义uiController


我应该理解WorkerScript只能处理简单的情况吗?

正如您已经注意到的,
WorkerScript
无法访问UI控件。但是您的独立线程可以使用消息与主UI线程“对话”。对我来说,这与所有其他语言/框架的工作原理完全相同。只要在需要更新UI或对象时从线程发送消息即可。 例如:

WorkerScript.onMessage = function(message) {
    WorkerScript.sendMessage({ 'action': 'start' })
    // do some heavy task here
    WorkerScript.sendMessage({ 'action': 'finish', 'data': somedata })
}
因此,您的主要qml可能如下所示:

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;
        }
    }
}

根据您的建议,uiController.doSomething()和uiController.doSomethingAther()在UI线程中处理,不是吗?在我的例子中,uiController.doSomething()和uiController.doSomethingAnother()是实际的重功能,应该是后台线程中的计算机…啊,好的,现在我看到了。这里最好的方法是使用C++中的QToX来运行繁重的任务。用JavaScript代码运行C++任务是没有意义的,尽管不能将对象传递到WorkScript中。我不确定我理解到Word脚本是否有用。谁想在js中执行重减刑?无论如何,非常感谢你的帮助!