我正在开发一个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
}
}
}
}
任何人都知道是什么原因引起的以及如何解决?有没有不使用线程就可以修复的方法?
答案 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