alex_lip
alex_lipSept. 6, 2018, 8:04 a.m.

Обновить текст на кнопке во время выполнения 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(); } }




We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

10
alex_lip
  • Sept. 7, 2018, 2:24 a.m.

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

    alex_lip
    • Sept. 10, 2018, 4:18 a.m.
    • The answer was marked as a solution.

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

    WorkerScript
      alex_lip
      • Sept. 11, 2018, 4:36 a.m.

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

        Evgenii Legotckoi
        • Sept. 11, 2018, 4:37 a.m.

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

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

          alex_lip
          • Sept. 11, 2018, 5:48 a.m.
          • (edited)

          Перенесу - что делать( у меня часть логики и так там). Просто хотелось в 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
            • Sept. 11, 2018, 8:22 a.m.
            • (edited)

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

              alex_lip
              • Sept. 11, 2018, 9:18 a.m.
              • (edited)

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


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

                Evgenii Legotckoi
                • Sept. 12, 2018, 3:07 a.m.

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

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

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

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


                  Evgenii Legotckoi
                  • Sept. 12, 2018, 3:09 a.m.

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

                    alex_lip
                    • Sept. 12, 2018, 6:39 a.m.

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

                      Comments

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      МВ

                      Qt - Test 001. Signals and slots

                      • Result:68points,
                      • Rating points-1
                      ЛС

                      C++ - Test 001. The first program and data types

                      • Result:53points,
                      • Rating points-4
                      АА

                      C++ - Test 001. The first program and data types

                      • Result:60points,
                      • Rating points-1
                      Last comments
                      ИМ
                      Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                      Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas5July 5, 2024, 11:02 a.m.
                      QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssrFeb. 8, 2024, 6:43 p.m.
                      Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      EVA
                      EVADec. 25, 2023, 10:30 a.m.
                      Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                      Now discuss on the forum
                      C
                      CharlesmekOct. 3, 2024, 1:15 a.m.
                      добавить qlineseries в функции +7 (3812) 56-56-65 — городской телефон 052-83 — МТС 670 — Tele2 +7 (923) 699-30-03 — Мегафон 07-045 — Билайн https://mypsyhealth.ru/терапия/2022/04/27/blood-pressure 14 https://mypsyhealth…
                      JW
                      Jhon WickOct. 1, 2024, 3:52 p.m.
                      Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                      КГ
                      Кирилл ГусаревSept. 27, 2024, 9:09 a.m.
                      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                      F
                      FynjyJuly 22, 2024, 4:15 a.m.
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                      Follow us in social networks