【问题标题】:Changes via GUI thread are not reflected in workerscript通过 GUI 线程进行的更改不会反映在 workerscript 中
【发布时间】:2021-03-14 13:24:09
【问题描述】:

在下面的代码中,listmodel 在线程之间共享,并且设置了一个计时器来更新模型的值,这些更改应该在 workerscript (docs) 中反映(期望的行为)。但是在workerscript中,它总是初始值,因为它不知道数据已经改变了。

// 主文件

    Window {
    id: window
    visible: true
    width: 150
    height: 200
    title: qsTr("Hello Testing")

    DataModel {
        id: model
    }

    Timer {
        interval: 1000
        running: true
        repeat: true
        onTriggered: {
            model.setProperty(0, 'datum', new Date().toLocaleString())
        }
    }

    WorkerScript {
        id: bgScript
        source: "script.js"

    }

    Timer {
        interval: 1000
        running: true
        repeat: true
        onTriggered: {
            bgScript.sendMessage({'model': model})
        }
    }

    Text {
        id: datum
        text: qsTr(model.get(0).datum)
    }

}

// 工人脚本

WorkerScript.onMessage = function (arg) {
    console.log(arg.model.get(0).datum)   // value is "Date Time" on every call
}

// 型号

ListModel {

    ListElement {
        datum: "Date Time"
    }


}

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    您将模型复制到 JS 对象中,并将该对象传递给 JS 函数。您将永远不会从 JS 函数中收到类似对象的更新通知。绑定仅适用于 QML 属性,不适用于 JS 值。

    但即使这在一般情况下确实有效,它仍然无法在 WorkerScript 中工作。根据docs,WorkerScript js 文件无权访问调用 QML 的属性。

    由于 WorkerScript.onMessage() 函数是在单独的 线程,JavaScript 文件在与 主要的 QML 引擎。这意味着不同于普通的 JavaScript 导入 QML 的文件,即上例中的 script.mjs 无法访问 QML 的属性、方法或其他属性 项,也不能访问 QML 对象上设置的任何上下文属性 通过QQmlContext。

    【讨论】:

    • 感谢您的支持。即使它正在被复制,程序也必须在每个触发器[定时器]上传输一个新的模型副本。
    • 其次,文档说 ListModel 可以与 WorkerScript 一起使用,从多个线程访问列表模型
    • 是的,我明白你的意思。拨打setProperty后,您能否立即打印您的价值?
    • 我认为 workerscript 会接管模型并将更改同步到 GUI 线程,反之则不行。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多