Известно ли, что функция Qt QML может привести к сбою приложения? - PullRequest
0 голосов
/ 02 июня 2019

Я разрабатываю приложение QT qml, которое вызывает сбой приложения на компьютере с Windows после запуска функции qml.

Чтобы проиллюстрировать, что я собираюсь опубликовать здесь пример, который завершает работу приложения после запуска функции:

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 ]

4 голосов
/ 02 июня 2019

Вы выполняете очень длинную функцию в потоке GUI. Итак, ваш пользовательский интерфейс зависает, и диспетчер задач Windows считает , что ваше приложение больше не отвечает.

Если вы дождетесь окончания функции, приложение снова будет работать.

Вы должны запустить свою функцию JS в другом потоке, используя WorkerScript .

Например:

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

0 голосов
/ 23 июня 2019

То, что сказал @Ромхакорев, имеет смысл, никогда не бывает круто иметь заблокированное приложение.

Но настоящая проблема в ОС Windows может быть связана с 32-разрядным 32-разрядным компилятором MinGW.

Чтобы решить эту проблему, мы можем переключиться на Qt 5.12.2 / 3, чтобы использовать 64-битную версию MinGW, которая решает эту конкретную проблему.

Я разместил похожий вопрос на: https://forum.qt.io/topic/103670/qml-is-crashing-when-the-ui-is-blocked-for-some-time-in-windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...