P
Pusher28 травня 2022 р. 08:48

Как очичтисть очередь событий для конпки

В программе есть длительная операция (может достигать 50 сек.).
Во время этой операции вызываю Dialog{ modal: true }. В диалоговом окне прогресс бар и кнопка закрытия окна,
у которой enabled: false. По окончанию операции кнопке закрытия ставлю enabled: true.

Если во время дляительной операции нажать кнопку закрытия на диалоговом окне,а потом любую другую кнопку или объект в главном окне программы, то после окончания операции, как только ставлю кнопеке enabled: true, диалоговое окно закрывается и происходит обработка остальных нажатий. Т.е. получается, что события накапливаются в очереди и обрабатываются позже.

Собственно вопрос, как очисть события для кнопки до установки enabled: true?

Upd. пробовал QCoreApplication::removePostedEvents(nullptr) эффекта нет.

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

Вам це подобається? Поділіться в соціальних мережах!

12
o
  • 28 травня 2022 р. 13:00
  • (відредаговано)

не нужно очишать очередь, нужно, писать приложение многопоточным через qthread или qconcurrent

    P
    • 28 травня 2022 р. 13:12
    • (відредаговано)

    Каким образом открыть модальное диалоговое окноно в QML из другого потока?
    Не понимаю, зачем в данном случае многопоточность, нужно просто, чтобы кнопка, когда она не активна не принимала события.

      o
      • 28 травня 2022 р. 17:11

      нужно сделать связку qml и c++, тяжелые задачи отправляются на обработку в с++, в qml остаются только быстрые.
      и у кнопок есть свойство
      enabled: true\false
      при запуске\остановке задачи нужно задать соответсвующее занчение этого параметра.

        P
        • 29 травня 2022 р. 02:51
        • (відредаговано)

        нужно сделать связку qml и c++, тяжелые задачи отправляются на обработку в с++, в qml остаются только быстрые

        на QML только QUI, остальное в C++, что нужно выведено в отдельный поток, при чем тут это?

        и у кнопок есть свойство enabled: true\false при запуске\остановке задачи нужно задать соответсвующее занчение этого параметра.

        После установки у кнопки enabled: true происходит обработка нажатия, которое блыо сделано пока кнопка была неактивна (enabled: false), закрывается диалоговое окно и обрабатываются остальные нажатия, причем все, которые сделал.

          o
          • 29 травня 2022 р. 15:49
          • (відредаговано)

          на QML только QUI, остальное в C++, что нужно выведено в отдельный поток, при чем тут это?

          явно, что-то идет не так.

          enabled: true происходит обработка нажатия, которое блыо сделано пока кнопка была неактивна (enabled: false),

          этого не может быть.
          хорошо бы предявить исходный код.

            P
            • 29 травня 2022 р. 16:09

            Я думал, что сигналы к неактивным эффектам должны отбрасываться, а не копиться в очереди.
            Попробую на досуге сделать минимальный тестовый проэкт.

              o
              • 29 травня 2022 р. 16:37
              • Відповідь була позначена як рішення.

              ок

                P
                • 30 травня 2022 р. 12:04

                Тестовый проект сделал, но на нем все работает нормально.

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

                    static QEventLoop loop;
                    static QTimer timer;
                
                    connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
                    connect(this, &Writer::recivedMidiMessage, &loop, &QEventLoop::quit);
                
                    timer.setSingleShot(true);
                    timer.start(waitMs);
                    loop.exec(QEventLoop::ExcludeUserInputEvents);
                

                ost.vld - спасибо за помощь

                  juvf
                  • 31 травня 2022 р. 00:35

                  читаю с первого поста.... ни чего не понятно.... это конечно хорошо, что у вас проблема решилась. Но....
                  1. "В программе есть длительная операция (может достигать 50 сек.). Во время этой операции вызываю Dialog{ modal: true }." - т.е. эта длительная операция выполняется в gui потоке?

                  1. "В диалоговом окне прогресс бар" - как происходит обновление/переисовка бара?

                  2. "кнопка закрытия окна, у которой enabled: false" + "Если во время дляительной операции нажать кнопку закрытия" - а как такое возможно? Как можно даже теоретически нажать дизейбленную кнопку? Что такое "нажать кнопку"? Есть разные способы (мышкой, клавиатурой, палец+тачскрин, ....) - "нажать кнопку" (будем считать, что кнопка без фиксации) - это значит передать ей фокус, перевести её в состояние "нажатая" и перевести её в состояние "отжатая" - вот тогда это будет считаться "нажали кнопку". Как вы умудрились задезейбленую кнопку перевести в состояние "нажатая"? Может всё таки вы не "нажали кнопку", а кликнули мышкой по неактивной кнопке?

                  3. ..... ещё есть вопросы конечно.... взглянуть бы на исходный код. Вам бы быстрее помогли, на и вопросов бы было мнеьше.

                    P
                    • 31 травня 2022 р. 02:46
                    1. "В диалоговом окне прогресс бар" - как происходит обновление/переисовка бара?

                    По сигналу прогрессбар обновляется.

                    1. кнопка закрытия окна, у которой enabled: false" + "Если во время дляительной операции нажать кнопку закрытия" - а как такое возможно? Как можно даже теоретически нажать дизейбленную кнопку? Что такое "нажать кнопку"? Есть разные способы (мышкой, клавиатурой, палец+тачскрин, ....) - "нажать кнопку" (будем считать, что кнопка без фиксации) - это значит передать ей фокус, перевести её в состояние "нажатая" и перевести её в состояние "отжатая" - вот тогда это будет считаться "нажали кнопку". Как вы умудрились задезейбленую кнопку перевести в состояние "нажатая"? Может всё таки вы не "нажали кнопку", а кликнули мышкой по неактивной кнопке?

                    Кнопка прорисована, но не активна, нажимаешь мышкой, естественно ничего не происходит.
                    Но как только ставишь enabled: true, то происходит обработка нажатия

                    1. ..... ещё есть вопросы конечно.... взглянуть бы на исходный код. Вам бы быстрее помогли, на и вопросов бы было мнеьше.

                    Весь проект скинуть не могу, поэтому так, изначально подумал, что поведение штатное и есть решение.
                    Оказалось, что побочный эффект.

                    Длительная операция, прошивка устройства, протокол обмена продиктован устройством, повлиять на него никак не могу.
                    Данные передаются пакетами по 2 КБ, потом от устройства приходит ответ, что все получено и т.д.
                    Ответ приходит через callback, поэтому и нужна функция ожидания: или пришел ответ и данные передаются дальше, или ответа нет и передача данных прерывается. Собственно во время ожидания и запускал loop.exec(QEventLoop::ExcludeUserInputEvents);
                    Перепишу все на сигналах с таймером.

                      juvf
                      • 31 травня 2022 р. 03:16

                      я делал подобные задачи... чтоб не возиться с потоками - всю передачу вел в потоке GUI. т.е. по кнопке "Burn" вызывался слот и прямо в слоте дизаблил виджеты, в цыкле делал прошивку (отправку и прием данных) и задавал значения прогрессБару, после цыкла енаблел виджеты. Естественно если так сделать, то гуи не перерисуется до выхода из слота. И все клики по кнопкам накопятся и отработаются после прошивки. Чтобы не копились события, чтобы во время длительной операции перерисовавался прогресс и перерисовывались (дазабле/енабле) кнопки и виджеты, в цыкле отправки/ожидания данных нужно переодически вызывать

                      QCoreApplication::processEvents(QEventLoop::AllEvents);

                      Да, может не совсем хороший способ в GUI потоке делать медленную переправку данных, но для мелких поделок разводить кучу дополнительных потоков и переплетение их сигналами/слотами, да ещё и таймера - это оверинженеринг. А так, можно по быстрому что-то простое сделать. Визуально это будет выглядеть как "работа GUI" в своем потоке, "примем/отправка данных" в своем потоке.

                      void MyProg::burn() //slot
                      {
                          burnBut->setEnable(false);
                          cancelBut->setEnable(false);
                          stopBut->setEnable(true);
                          progress->setEnable(true);
                          progress->setValue(true);
                          QCoreApplication::processEvents(QEventLoop::AllEvents);
                          while(какойнить флаг готовности)
                          {
                              //длительная процедура
                      
                              /*
                              * тут быстрая отправка
                              */
                      
                              QCoreApplication::processEvents(QEventLoop::AllEvents);
                              if(stopBut->wasClicked)
                                  break;
                              progress->setValue(newValue);
                              QCoreApplication::processEvents(QEventLoop::AllEvents);
                              sleep(10); // если нет ожиданий коротких в while, то можно слыпом подстраховаться.  
                          }
                          burnBut->setEnable(true);
                          cancelBut->setEnable(true);
                          stopBut->setEnable(false);
                          progress->setEnable(false);
                          QCoreApplication::processEvents(QEventLoop::AllEvents);//тут не обязательно. 
                      }
                      
                        P
                        • 31 травня 2022 р. 03:51

                        QCoreApplication::processEvents(QEventLoop::AllEvents);

                        вот это надо протестировать

                        Да, может не совсем хороший способ в GUI потоке делать медленную переправку данных, но для мелких поделок разводить кучу дополнительных потоков и переплетение их сигналами/слотами, да ещё и таймера - это оверинженеринг. А так, можно по быстрому что-то простое сделать. Визуально это будет выглядеть как "работа GUI" в своем потоке, "примем/отправка данных" в своем потоке.

                        Тут согласен, в моем случае во время записи, кроме самой записи только перерисовка GUI и нужна.

                          Коментарі

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

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:50бали,
                          • Рейтинг балів-4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 11:37

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:80бали,
                          • Рейтинг балів4
                          m
                          • molni99
                          • 26 жовтня 2024 р. 11:29

                          C++ - Тест 004. Указатели, Массивы и Циклы

                          • Результат:20бали,
                          • Рейтинг балів-10
                          Останні коментарі
                          ИМ
                          Игорь Максимов22 листопада 2024 р. 22:51
                          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                          Evgenii Legotckoi
                          Evgenii Legotckoi01 листопада 2024 р. 00:37
                          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                          A
                          ALO1ZE19 жовтня 2024 р. 18:19
                          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                          ИМ
                          Игорь Максимов05 жовтня 2024 р. 17:51
                          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                          d
                          dblas505 липня 2024 р. 21:02
                          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                          Тепер обговоріть на форумі
                          Evgenii Legotckoi
                          Evgenii Legotckoi25 червня 2024 р. 01:11
                          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                          t
                          tonypeachey115 листопада 2024 р. 17:04
                          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                          NSProject
                          NSProject04 червня 2022 р. 13:49
                          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                          9
                          9Anonim25 жовтня 2024 р. 19:10
                          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                          Слідкуйте за нами в соціальних мережах