какой максимальный размер для массива в QML? - PullRequest
0 голосов
/ 20 мая 2019

Меня беспокоит создание массива объектов с большим количеством данных в qml с использованием платформы Windows (это единственный случай, когда происходит сбой). По какой-то причине происходит сбой приложения, если функция обработки занимает слишком много времени!

Я собираюсь проиллюстрировать частью кода, что я хочу сделать:

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.4
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

ApplicationWindow {
    id: window
    title: "Stack"
    visible: true
    width: 1400
    Page {
        id: page
        anchors.fill: parent
        property int responsiveWidth: 1000
        property int maximumWidth: 900
        ScrollView {
            id:configScroll
            anchors.fill: parent
            GridLayout {
                columns: 2
                width: page.width > page.responsiveWidth ? page.maximumWidth : page.width
                anchors.top: parent.top
                anchors.left: parent.left
                anchors.leftMargin: page.width > page.responsiveWidth ? (page.width - childrenRect.width)/2 : 10
                anchors.rightMargin: page.width > page.responsiveWidth ? 0 : 10
                    Button {
                        property bool test: true
                        text: "array func"
                        onClicked: {
                            var panelModes=[], rows=[],groupsModes=[], panelLabel="panel", sounderLabel="sounder",soundersModeLabel="sounder mode",sounderGroupLabel="sounder group"
                            for(var gSndrModeAdd=0; gSndrModeAdd<1000;gSndrModeAdd++) {
                                panelModes = []
                                for(var pSndrModeAdd=0; pSndrModeAdd<32; pSndrModeAdd++) {
                                    rows = []
                                    rows.push(["C1",1])
                                    rows.push(["C2",1])
                                    for(var sSndrModeAdd=0; sSndrModeAdd<32; sSndrModeAdd++) {
                                        rows.push(["L1S"+(sSndrModeAdd+1),1])
                                        rows.push(["L2S"+(sSndrModeAdd+1),1])
                                        rows.push(["L3S"+(sSndrModeAdd+1),1])
                                        rows.push(["L4S"+(sSndrModeAdd+1),1])
                                    }
                                    panelModes.push({"label":panelLabel, "value": 1, "headers":[sounderLabel,soundersModeLabel],"rows":rows})
                                }
                                groupsModes.push({"label":sounderGroupLabel,"value":1,"nested":panelModes})
                            }
                            console.log("the array is: ")
                            console.log(groupsModes)
                        }
                    }
            }
        }
    }
}

Это вылетает.

Если это не проблема с массивом, связана ли эта проблема с памятью? что-то подобное?

Это необходимо для построения структуры, которую я хочу. Есть ли способ решить это?

Ошибка, которую я получаю на консоли:

09:45:07: The program has unexpectedly finished.

09:45:07: The process was ended forcefully.

09:45:07: C:/Dev/QT/build-array-crash-limit-Desktop_Qt_5_11_1_MinGW_32bit-Debug/debug/array-crash-limit.exe crashed.

Мне удалось поймать Memory usage с помощью QML Profiler, если я установил первый для цикла на 300. enter image description here enter image description here

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

у вас есть ошибка здесь

...
for(var pSndrModeAdd=0; 32; pSndrModeAdd++) {
...

и цикл будет работать вечно.Измените на

...
for(var pSndrModeAdd=0; pSndrModeAdd<32; pSndrModeAdd++) {
...

В любом случае массивы в QML - это просто массивы JavaScript, так как они не имеют (практически) максимального размера.

0 голосов
/ 13 июля 2019

Оказывается, сбой приложения происходит только на платформе Windows. В MACOS и LINUX блокируются только на время обработки функции.

Возможно, это действительно проблема с памятью, которая возникает в Windows с версиями QT, использующими 32-битный MinGW.

Решение для решения этой проблемы? Использование MinGW 64-bit .

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