Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Text box is not refreshing content on window.
Qt 6.11 is out! See what's new in the release blog

Text box is not refreshing content on window.

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 3 Posters 1.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jenya7
    wrote on last edited by jenya7
    #1
    int main(int argc, char *argv[])
    {
        uint32_t discovered = 0;
    
        QApplication a(argc, argv);
    
        MainWindow w;
        w.show();
    
        QObject::connect(&m_sys, &SYS::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
        QObject::connect(&m_comparser, &COMPARSER::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
        QObject::connect(&m_commands, &COMMANDS::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
        QObject::connect(&m_sensor, &SENSOR::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
        QObject::connect(&m_script, &SCRIPT::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
    
        //load parameters+script from a default file location
        m_sys.ParamInit(nullptr);
        m_sys.ScriptInit(sys_params.script_file);
    
        rt_params.connected = wifi_udp.Start(sys_params.local_ip, sys_params.local_port);
        if (rt_params.connected )
            m_sys.Print("UDP - OK\n");
        else
           m_sys.Print("UDP - FAIL\n");
    
        w.repaint();  //does not help
        w.update();  //does not help
    
       discovered = m_sensor.DiscoverConcurrent(0, 4, SYS_DISC_MODE_ALL);
       
        QFuture<void> future = QtConcurrent::run(&ScriptRun);
    
        return a.exec();
    }
    

    The function m_sensor.DiscoverConcurrent - runs concurrent - a separated thread and should not block the GUI thread.
    If I comment m_sensor.DiscoverConcurrent - all functions (m_sys.ParamInit, m_sys.ScriptInit) print some messages in a text box and I see it and it's OK.
    But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints (it captures a part of the desktop). After m_sensor.DiscoverConcurrent finishes - all prints available in the text box.
    It doesn't affect functionality but looks ugly to a user.

    jsulmJ 1 Reply Last reply
    0
    • J jenya7
      int main(int argc, char *argv[])
      {
          uint32_t discovered = 0;
      
          QApplication a(argc, argv);
      
          MainWindow w;
          w.show();
      
          QObject::connect(&m_sys, &SYS::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
          QObject::connect(&m_comparser, &COMPARSER::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
          QObject::connect(&m_commands, &COMMANDS::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
          QObject::connect(&m_sensor, &SENSOR::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
          QObject::connect(&m_script, &SCRIPT::SendMessage, &w, &MainWindow::DisplayTerminalMessage);
      
          //load parameters+script from a default file location
          m_sys.ParamInit(nullptr);
          m_sys.ScriptInit(sys_params.script_file);
      
          rt_params.connected = wifi_udp.Start(sys_params.local_ip, sys_params.local_port);
          if (rt_params.connected )
              m_sys.Print("UDP - OK\n");
          else
             m_sys.Print("UDP - FAIL\n");
      
          w.repaint();  //does not help
          w.update();  //does not help
      
         discovered = m_sensor.DiscoverConcurrent(0, 4, SYS_DISC_MODE_ALL);
         
          QFuture<void> future = QtConcurrent::run(&ScriptRun);
      
          return a.exec();
      }
      

      The function m_sensor.DiscoverConcurrent - runs concurrent - a separated thread and should not block the GUI thread.
      If I comment m_sensor.DiscoverConcurrent - all functions (m_sys.ParamInit, m_sys.ScriptInit) print some messages in a text box and I see it and it's OK.
      But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints (it captures a part of the desktop). After m_sensor.DiscoverConcurrent finishes - all prints available in the text box.
      It doesn't affect functionality but looks ugly to a user.

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @jenya7 said in Text box is not refreshing on window.:

      But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints

      Sounds like m_sensor.DiscoverConcurrent is a blocking call and does NOT run concurrently.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      J 1 Reply Last reply
      0
      • jsulmJ jsulm

        @jenya7 said in Text box is not refreshing on window.:

        But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints

        Sounds like m_sensor.DiscoverConcurrent is a blocking call and does NOT run concurrently.

        J Offline
        J Offline
        jenya7
        wrote on last edited by jenya7
        #3

        @jsulm said in Text box is not refreshing on window.:

        @jenya7 said in Text box is not refreshing on window.:

        But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints

        Sounds like m_sensor.DiscoverConcurrent is a blocking call and does NOT run concurrently.

        May be.

        uint32_t SENSOR::DiscoverConcurrent(uint8_t min, uint8_t max, uint8_t mode)
        {
            QFuture<uint32_t> future;
        
             rt_params.service = 1;
        
             switch (mode)
             {
                 case SYS_DISC_MODE_ALL:
                     future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexAll, max);
                 break;
                 case SYS_DISC_MODE_RANGE:
                       future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexRange, min, max);
                 break;
                 case SYS_DISC_MODE_FILE:
                       future = QtConcurrent::run(this, &SENSOR::DiscoverByList);
                 break;
             }
        
            rt_params.service = 0;
        
            return future;
        }
        

        At least I try. I get no exceptions or run time messages. How can I be sure another thread was created?
        The function is executed - I see result on finish.

        jsulmJ J.HilkJ 2 Replies Last reply
        0
        • J jenya7

          @jsulm said in Text box is not refreshing on window.:

          @jenya7 said in Text box is not refreshing on window.:

          But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints

          Sounds like m_sensor.DiscoverConcurrent is a blocking call and does NOT run concurrently.

          May be.

          uint32_t SENSOR::DiscoverConcurrent(uint8_t min, uint8_t max, uint8_t mode)
          {
              QFuture<uint32_t> future;
          
               rt_params.service = 1;
          
               switch (mode)
               {
                   case SYS_DISC_MODE_ALL:
                       future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexAll, max);
                   break;
                   case SYS_DISC_MODE_RANGE:
                         future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexRange, min, max);
                   break;
                   case SYS_DISC_MODE_FILE:
                         future = QtConcurrent::run(this, &SENSOR::DiscoverByList);
                   break;
               }
          
              rt_params.service = 0;
          
              return future;
          }
          

          At least I try. I get no exceptions or run time messages. How can I be sure another thread was created?
          The function is executed - I see result on finish.

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @jenya7 Why is the return type uint32_t and not QFuture<uint32_t>?

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          J 1 Reply Last reply
          0
          • J jenya7

            @jsulm said in Text box is not refreshing on window.:

            @jenya7 said in Text box is not refreshing on window.:

            But if m_sensor.DiscoverConcurrent runs - it blocks the text box and I don't see any prints

            Sounds like m_sensor.DiscoverConcurrent is a blocking call and does NOT run concurrently.

            May be.

            uint32_t SENSOR::DiscoverConcurrent(uint8_t min, uint8_t max, uint8_t mode)
            {
                QFuture<uint32_t> future;
            
                 rt_params.service = 1;
            
                 switch (mode)
                 {
                     case SYS_DISC_MODE_ALL:
                         future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexAll, max);
                     break;
                     case SYS_DISC_MODE_RANGE:
                           future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexRange, min, max);
                     break;
                     case SYS_DISC_MODE_FILE:
                           future = QtConcurrent::run(this, &SENSOR::DiscoverByList);
                     break;
                 }
            
                rt_params.service = 0;
            
                return future;
            }
            

            At least I try. I get no exceptions or run time messages. How can I be sure another thread was created?
            The function is executed - I see result on finish.

            J.HilkJ Online
            J.HilkJ Online
            J.Hilk
            Moderators
            wrote on last edited by
            #5

            @jenya7
            I assume

            uint32_t SENSOR::DiscoverConcurrent(uint8_t min, uint8_t max, uint8_t mode)
            {
                QFuture<uint32_t> future;
            ....
               return future;
            }
            

            does an implicit call to result() to return the uint32_t value,

            which will wait until the concurrent has run its course.

            Congratulations, you turned it back into a synchronous program :P

            give the QFuture object to an QFutureWatcher instance and listen to the finished signal there.


            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


            Q: What's that?
            A: It's blue light.
            Q: What does it do?
            A: It turns blue.

            jsulmJ 1 Reply Last reply
            0
            • J.HilkJ J.Hilk

              @jenya7
              I assume

              uint32_t SENSOR::DiscoverConcurrent(uint8_t min, uint8_t max, uint8_t mode)
              {
                  QFuture<uint32_t> future;
              ....
                 return future;
              }
              

              does an implicit call to result() to return the uint32_t value,

              which will wait until the concurrent has run its course.

              Congratulations, you turned it back into a synchronous program :P

              give the QFuture object to an QFutureWatcher instance and listen to the finished signal there.

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @J-Hilk said in Text box is not refreshing content on window.:

              does an implicit call to result() to return the uint32_t value

              Yes, this is also what I think is happeneing, but can't find anything related to this in QFuture documentation.

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              J.HilkJ 1 Reply Last reply
              0
              • jsulmJ jsulm

                @J-Hilk said in Text box is not refreshing content on window.:

                does an implicit call to result() to return the uint32_t value

                Yes, this is also what I think is happeneing, but can't find anything related to this in QFuture documentation.

                J.HilkJ Online
                J.HilkJ Online
                J.Hilk
                Moderators
                wrote on last edited by
                #7

                @jsulm probably this one ?

                https://doc.qt.io/qt-5/qfuture.html#operator-T


                Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                Q: What's that?
                A: It's blue light.
                Q: What does it do?
                A: It turns blue.

                1 Reply Last reply
                2
                • jsulmJ jsulm

                  @jenya7 Why is the return type uint32_t and not QFuture<uint32_t>?

                  J Offline
                  J Offline
                  jenya7
                  wrote on last edited by
                  #8

                  @jsulm said in Text box is not refreshing on window.:

                  @jenya7 Why is the return type uint32_t and not QFuture<uint32_t>?

                  I fixed it. But the issue stays.

                  jsulmJ 1 Reply Last reply
                  0
                  • J jenya7

                    @jsulm said in Text box is not refreshing on window.:

                    @jenya7 Why is the return type uint32_t and not QFuture<uint32_t>?

                    I fixed it. But the issue stays.

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by jsulm
                    #9

                    @jenya7 said in Text box is not refreshing content on window.:

                    I fixed it

                    I bet you did not, because discovered variable is still uint32_t, right?
                    Please read what @J-Hilk wrote.

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    J 1 Reply Last reply
                    0
                    • jsulmJ jsulm

                      @jenya7 said in Text box is not refreshing content on window.:

                      I fixed it

                      I bet you did not, because discovered variable is still uint32_t, right?
                      Please read what @J-Hilk wrote.

                      J Offline
                      J Offline
                      jenya7
                      wrote on last edited by jenya7
                      #10

                      @jsulm said in Text box is not refreshing content on window.:

                      @jenya7 said in Text box is not refreshing content on window.:

                      I fixed it

                      I bet you did not, because discovered variable is still uint32_t, right?
                      Please read what @J-Hilk wrote.

                      Now it is
                      in main.cpp

                      QFuture<uint32_t>  discovered;
                      

                      in sensor.cpp

                      QFuture<uint32_t> SENSOR::DiscoverConcurrent()........
                      

                      Still the same.

                      Wait a minute... SENSOR::DiscoverConcurrent calls

                      future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexAll, max);
                      

                      so SENSOR::DiscoverByIndexAll - should be also QFuture<uint32_t> ?

                      well..the problem is only on start up. If I call SENSOR::DiscoverConcurrent() from another place (after return a.exec();) it works good.

                      J 1 Reply Last reply
                      0
                      • J jenya7

                        @jsulm said in Text box is not refreshing content on window.:

                        @jenya7 said in Text box is not refreshing content on window.:

                        I fixed it

                        I bet you did not, because discovered variable is still uint32_t, right?
                        Please read what @J-Hilk wrote.

                        Now it is
                        in main.cpp

                        QFuture<uint32_t>  discovered;
                        

                        in sensor.cpp

                        QFuture<uint32_t> SENSOR::DiscoverConcurrent()........
                        

                        Still the same.

                        Wait a minute... SENSOR::DiscoverConcurrent calls

                        future = QtConcurrent::run(this, &SENSOR::DiscoverByIndexAll, max);
                        

                        so SENSOR::DiscoverByIndexAll - should be also QFuture<uint32_t> ?

                        well..the problem is only on start up. If I call SENSOR::DiscoverConcurrent() from another place (after return a.exec();) it works good.

                        J Offline
                        J Offline
                        jenya7
                        wrote on last edited by
                        #11

                        What if I want to invoke SENSOR::DiscoverConcurrent() after return a.exec();?
                        What event to connect?

                        QObject::connect(&a, a.???
                        
                        jsulmJ 1 Reply Last reply
                        0
                        • J jenya7

                          What if I want to invoke SENSOR::DiscoverConcurrent() after return a.exec();?
                          What event to connect?

                          QObject::connect(&a, a.???
                          
                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          @jenya7 said in Text box is not refreshing content on window.:

                          What event to connect?

                          Why do you need an event/signal for that?
                          Just call it after a.exec()...

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          J 1 Reply Last reply
                          1
                          • jsulmJ jsulm

                            @jenya7 said in Text box is not refreshing content on window.:

                            What event to connect?

                            Why do you need an event/signal for that?
                            Just call it after a.exec()...

                            J Offline
                            J Offline
                            jenya7
                            wrote on last edited by jenya7
                            #13

                            @jsulm said in Text box is not refreshing content on window.:

                            @jenya7 said in Text box is not refreshing content on window.:

                            What event to connect?

                            Why do you need an event/signal for that?
                            Just call it after a.exec()...

                            what is "after"?

                            int main(int argc, char *argv[])
                            {
                               ............
                              return a.exec();
                            
                              discovered = m_sensor.DiscoverConcurrent(0, 4, SYS_DISC_MODE_ALL);
                            }
                            

                            code will never be executed.

                            jsulmJ 1 Reply Last reply
                            0
                            • J jenya7

                              @jsulm said in Text box is not refreshing content on window.:

                              @jenya7 said in Text box is not refreshing content on window.:

                              What event to connect?

                              Why do you need an event/signal for that?
                              Just call it after a.exec()...

                              what is "after"?

                              int main(int argc, char *argv[])
                              {
                                 ............
                                return a.exec();
                              
                                discovered = m_sensor.DiscoverConcurrent(0, 4, SYS_DISC_MODE_ALL);
                              }
                              

                              code will never be executed.

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @jenya7 said in Text box is not refreshing content on window.:

                              code will never be executed

                              Well, it is really not hard to change this code in a way it does what you want.
                              But I will let this simple exercise to you...

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved