Qt QML函数可能会使应用程序崩溃吗?

时间:2019-06-02 14:58:19

标签: qt qml

我正在开发一个QT qml应用程序,该应用程序在运行qml函数后使Windows计算机上的应用程序崩溃。

为了说明这一点,我将在此发布一个示例,该示例在运行函数后使应用程序崩溃:

import QtQuick 2.0
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3
import AsyncWorker 1.0

ApplicationWindow {
    id: window
    title: "Stack"
    visible: true
    width: 600
    height: 500
    Page {
        id: page
        anchors {
            fill: parent
            margins: 10
        }

        ColumnLayout {
            anchors.fill: parent
            spacing: 10
            RowLayout {
                id: testRowLayout

                function bigfunction() {
                    var teste = 0
                    var arrayTeste = []
                    for(var i=0; i< 100000; i++)
                        teste +=i
                        arrayTeste.push(i)
                        for(var j=0; j<100000;j++) {
                            teste +=j
                            arrayTeste.push(j)
                            for(var z=0; z<10000; z++) {
                                teste +=z
                                arrayTeste.push(z)
                            }
                        }
                    console.log(teste)
                    spinner.running = false
                }

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

                Button {
                    Layout.alignment: Qt.AlignHCenter
                    text: qsTr("Run function")
                    onClicked: {
                        spinner.running = true
                        testRowLayout.bigfunction()
                    }
                }
            }
            Item {
                Layout.fillHeight: true
            }
        }
    }
}

任何人都知道是什么原因引起的以及如何解决?有没有不使用线程就可以修复的方法?

2 个答案:

答案 0 :(得分:4)

您正在GUI线程中运行一个很长的函数。因此,您的UI冻结了,Windows任务管理器认为您的应用不再响应。

如果您等待功能结束,则该应用将再次运行。

您必须使用WorkerScript在另一个线程中运行JS函数。

例如:

ApplicationWindow {
    id: window
    title: "Stack"
    visible: true
    width: 600
    height: 500

    WorkerScript {
        id: worker
        source: "worker.mjs"
        onMessage: {
            spinner.running = !messageObject.finished
            console.log(messageObject.result)
        }
    }

    Button {
        Layout.alignment: Qt.AlignHCenter
        text: qsTr("Run function")
        onClicked: {
            worker.sendMessage({});
        }
    }

    BusyIndicator {
        id: spinner
        anchors.centerIn: parent
        running: false
    }
}
// worker.mjs
WorkerScript.onMessage = function(message) {
    var teste = 0
    WorkerScript.sendMessage({'finished': false, 'result': teste});
    var arrayTeste = []
    for(var i=0; i< 10000; i++) {
        teste +=i
        arrayTeste.push(i)
        for(var j=0; j<10000;j++) {
            teste +=j
            arrayTeste.push(j)
            for(var z=0; z<10000; z++) {
                teste +=z
                arrayTeste.push(z)
            }
        }
    }
    WorkerScript.sendMessage({'finished': true, 'result': teste});
}

答案 1 :(得分:0)

@Romhakorev所说的是有道理的,拥有被阻止的应用程序永远都不酷。

但是Windows操作系统上的真正问题可能与32 MinGW 32位编译器有关。

要解决此问题,我们可以切换到Qt 5.12.2 / 3以使用MinGW 64位来解决此特定问题。

我在以下问题上发布了类似的问题: https://forum.qt.io/topic/103670/qml-is-crashing-when-the-ui-is-blocked-for-some-time-in-windows