alex_lip
alex_lipҚыр. 6, 2018, 8:04 Т.Ж.

Обновить текст на кнопке во время выполнения js скрипта


Есть кнопка, в которой выполняется скрипт (сначала в слое qt строиться модель, потом через сигнал на слое qml записываются записи из модели в таблицу sqllite). Хотелось бы, чтобы на кнопке шел счетчик каждые 20 записей.
Но показывается только последнее изменение - когда скрипт уже отработал. Где у меня проблема?Может быть проблема с биндингом? И надо через state и change property присваивать значения?

Item {
    id:root_i
     property string mytext
    function text_all_tree(m_i, m_row_count){
        root_i.mytext =  (m_i+1).toString()+"/"+m_row_count ;
        console.log((m_i+1).toString()+"/"+m_row_count);
    }

 onSendToQml_all_tree: {

            EsdDb.deleteDataAll_tree();
            for (var i=0; i<myModel_All_tree.rowCount(); i++) {
                var m_officeid = myModel_All_tree.getOFFICEID(i);
                var m_parent_officeid = myModel_All_tree.getPARENT_OFFICEID(i);
                var m_name_office = myModel_All_tree.getNAME_OFFICE(i);
                var m_if_children = myModel_All_tree.getIF_CHILDREN(i);
                EsdDb.storeDataAll_tree(m_officeid, m_parent_officeid, m_name_office, m_if_children,i,row_count);
                if (i%20===0){
                    root_i.text_all_tree(i,row_count);
                }
            }
        }

TextButton { id: b_all_tree text: root_i.mytext anchors.top: parent.top anchors.left: parent.left anchors.rightMargin: 7 anchors.topMargin: 5 anchors.bottomMargin: 5 width: parent.width/4 smooth: false onClicked: { progressBar.value=0.05; appCore.f_RUN_All_tree(); } }




Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

10
alex_lip
  • Қыр. 7, 2018, 2:24 Т.Ж.

Поставил таймер на счетчик - текст кнопки просто 1,2,3.. - запускается - работает - когда начинает выполнение JS кнопки - останавливается - потом продолжает работать, когда JS кнопки заканчивается.

    alex_lip
    • Қыр. 10, 2018, 4:18 Т.Ж.
    • Жауап шешім ретінде белгіленді.

    Судя по всему решение в использовании

    WorkerScript
      alex_lip
      • Қыр. 11, 2018, 4:36 Т.Ж.

      Оказалось при данной постановке задачи - проблема не решаема! Высоконагруженный цикл должен быть в теле WorkerScript , а у оного нет доступа к LocalStorage. И к основному потоку тоже нет доступа. Поэтому апдейтить базу в нем не получается.

        Evgenii Legotckoi
        • Қыр. 11, 2018, 4:37 Т.Ж.

        Ох нефигасе Вы зарылись...

        Может Вам тогда каким-то образом перенести логику в С++?

          alex_lip
          • Қыр. 11, 2018, 5:48 Т.Ж.
          • (өңделген)

          Перенесу - что делать( у меня часть логики и так там). Просто хотелось в qml сделать. Зато много интересного прочитал ))  Очень интересно было наблюдать как функции, которые должны были выполниться в цикле JS  - выполняются по очереди после окончания цикла )) То есть js - консоль в цикле, а qml - тоже в цикле, но реально выполняется после него.


          js: ---

          js: htym

          js: ---

          js: 1/70

          js: ---

          js: 21/70

          js: ---

          js: 41/70

          js: ---

          js: 61/70

          qml: +++++

          qml: htym

          qml: +++++

          qml: 1/70

          qml: +++++

          qml: 21/70

          qml: +++++

          qml: 41/70

          qml: +++++

          qml: 61/70

            alex_lip
            • Қыр. 11, 2018, 8:22 Т.Ж.
            • (өңделген)

            Нашел очень интересный пример. Но у меня знаний не хватает его понять. Можете его прокомментировать? Исходники прилагаю.

              alex_lip
              • Қыр. 11, 2018, 9:18 Т.Ж.
              • (өңделген)

              Хм  -  проблема та же. Делаю счетчик в отдельном потоке в слое qt. Вывожу его в текст на слой qml. В слое qt счетчик увеличивается, а в слое qml - в момент выполнения "тяжелого" скрипта - вывода данных счетчика не происходит. То есть счетчик продолжает крутится в другом потоке, но отображение его значения а GUI не происходит до тех пор, пока "тяжелый" скрипт не завершится.


              кстати файл прилип. Я его не прикреплял.

                Evgenii Legotckoi
                • Қыр. 12, 2018, 3:07 Т.Ж.

                Насколько помню из документации, то QML в отличие от классических виджетов работает как минимум в двух потоках.

                Классические виджеты работают в одном главном потоке GUI. И если нужно перенести какой-то объект в другой поток, то одним из способов является использование moveToThread . В этом имеется некоторая особенность поведения объектов, которые наследованы от QWidget. Их нельзя переносить в другие потоки, несмотря на то, что они изначально наследованы от QObject и также имеют метод moveToThread. Программа просто перестанет работать. Все виджеты должны быть в GUI-потоке.

                Конвейер же QML в данном случае кардинально отличается. Часть логики работает в одном потоке, а логика отрисовки, которая непосредственно работает с OpenGL, выполняется в другом потоке. Здесь возникает проблема синхронизации, решена она достаточно успешно по большей части, если судить по поведению QML последних версий. Но подозреваю что проблемы всё-таки имеются и возникают как раз в том случае, когда выполняются тяжёлые js-скрипты в QML. Возможно, что часть логики просто блокируется, пока не выполнится код скрипта. Это мои догадки, пожтому могу ошибаться, но на данный момент у меня такое теоретическое представление о вашей проблеме.

                Попробуйте по максимум перенести бизнес логику в C++, а на долю QML оставьте только отрисовку и логику интерфейса.


                  Evgenii Legotckoi
                  • Қыр. 12, 2018, 3:09 Т.Ж.

                  Спасибо за информацию с проблемой о файле, возможно, что не очищается форма без перезагрузки страницы, по возможности займусь этой проблемой.

                    alex_lip
                    • Қыр. 12, 2018, 6:39 Т.Ж.

                    В общем с учетом того, что я знаю сколько записей мне надо обновить и что у меня каждое обновление в отдельной транзакции - я решил проблему путем выполнение мелкого скрипта по таймеру. То есть скрипт вызывает сам себя через таймер. Вопрос закрыт.

                      Пікірлер

                      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                      Кіріңіз немесе Тіркеліңіз
                      Г

                      C++ - Тест 001. Первая программа и типы данных

                      • Нәтиже:66ұпай,
                      • Бағалау ұпайлары-1
                      t

                      C++ - Тест 001. Первая программа и типы данных

                      • Нәтиже:33ұпай,
                      • Бағалау ұпайлары-10
                      t

                      Qt - Тест 001. Сигналы и слоты

                      • Нәтиже:52ұпай,
                      • Бағалау ұпайлары-4
                      Соңғы пікірлер
                      G
                      GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                      Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                      d
                      dblas5Шілде 5, 2024, 11:02 Т.Ж.
                      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssrАқп. 8, 2024, 6:43 Т.Қ.
                      Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      АК
                      Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                      Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      Енді форумда талқылаңыз
                      Evgenii Legotckoi
                      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                      F
                      FynjyШілде 22, 2024, 4:15 Т.Ж.
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                      BlinCT
                      BlinCTМаусым 25, 2024, 1 Т.Ж.
                      Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                      BlinCT
                      BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                      Evgenii Legotckoi
                      Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                      Бізді әлеуметтік желілерде бақылаңыз