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. app using "excessive" CPU

app using "excessive" CPU

Scheduled Pinned Locked Moved Solved General and Desktop
42 Posts 10 Posters 8.0k Views 4 Watching
  • 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.
  • mrjjM mrjj

    @mzimmers
    Hi
    That stack trace is for

    1. starting app
      2: add break point
      3: let it loose focus to see the issue

    and not just set at startup so we ssee the first paint when it becomes visible?
    Just asking to be sure. Not seeing anything special besides maybe the sendSpontaneousEvent

    mzimmersM Offline
    mzimmersM Offline
    mzimmers
    wrote on last edited by
    #21

    @mrjj I'm not sure I follow you, but I modified my routine:

    void Widget::paintEvent(QPaintEvent *event)
    {
        static int count = 0;
        if (event->spontaneous())
        {
            //qDebug() << "spontaneous event" << count++;
        }
        else
        {
            QWidget::paintEvent(event);
        }
    }
    

    I put a breakpoint on QWidget::paintEvent...and it never, EVER hits. (Also, with this change, CPU usage remains the same.)

    This just gets weirder and weirder.

    mrjjM 1 Reply Last reply
    0
    • fcarneyF Offline
      fcarneyF Offline
      fcarney
      wrote on last edited by
      #22

      I am sorry this is such a struggle. I don't have anything more to add except a sarcastic example of wiggling:
      https://media.giphy.com/media/xT9KVjBI3W2283URdm/source.mp4

      C++ is a perfectly valid school of magic.

      mrjjM 1 Reply Last reply
      0
      • fcarneyF fcarney

        I am sorry this is such a struggle. I don't have anything more to add except a sarcastic example of wiggling:
        https://media.giphy.com/media/xT9KVjBI3W2283URdm/source.mp4

        mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #23

        @fcarney
        hehe that the sorts you want to debug with a flame thrower...

        1 Reply Last reply
        1
        • mzimmersM mzimmers

          @mrjj I'm not sure I follow you, but I modified my routine:

          void Widget::paintEvent(QPaintEvent *event)
          {
              static int count = 0;
              if (event->spontaneous())
              {
                  //qDebug() << "spontaneous event" << count++;
              }
              else
              {
                  QWidget::paintEvent(event);
              }
          }
          

          I put a breakpoint on QWidget::paintEvent...and it never, EVER hits. (Also, with this change, CPU usage remains the same.)

          This just gets weirder and weirder.

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #24

          @mzimmers

          well i just asked if it was not as in first run stack trace.
          but i think you are doing as i think reading your last post.

          Its very odd. Indeed.
          Does
          //qDebug() << "spontaneous event" << count++;
          trigger alow when testing then ?

          mzimmersM 1 Reply Last reply
          0
          • mrjjM mrjj

            @mzimmers

            well i just asked if it was not as in first run stack trace.
            but i think you are doing as i think reading your last post.

            Its very odd. Indeed.
            Does
            //qDebug() << "spontaneous event" << count++;
            trigger alow when testing then ?

            mzimmersM Offline
            mzimmersM Offline
            mzimmers
            wrote on last edited by
            #25

            @mrjj I just realized something -- from the docs:

            bool QEvent::spontaneous() const
            Returns true if the event originated outside the application (a system event); otherwise returns false.
            
            The return value of this function is not defined for paint events.
            

            So, I think this exercise was a waste of time.

            mrjjM 1 Reply Last reply
            0
            • mzimmersM mzimmers

              @mrjj I just realized something -- from the docs:

              bool QEvent::spontaneous() const
              Returns true if the event originated outside the application (a system event); otherwise returns false.
              
              The return value of this function is not defined for paint events.
              

              So, I think this exercise was a waste of time.

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #26

              @mzimmers

              Well i find it very odd you see many paint events for the widget (with event filter) but
              its not constantly Hitting the break point in paintEvent. ??
              Or did i misunderstood something ?

              mzimmersM 1 Reply Last reply
              0
              • mrjjM mrjj

                @mzimmers

                Well i find it very odd you see many paint events for the widget (with event filter) but
                its not constantly Hitting the break point in paintEvent. ??
                Or did i misunderstood something ?

                mzimmersM Offline
                mzimmersM Offline
                mzimmers
                wrote on last edited by
                #27

                @mrjj you understand it perfectly, and "odd" is a mild term for it.

                I seriously don't know what to look at here. I'm afraid that the profiler we run tomorrow won't show anything in my code space.

                mrjjM JonBJ 2 Replies Last reply
                0
                • mzimmersM mzimmers

                  @mrjj you understand it perfectly, and "odd" is a mild term for it.

                  I seriously don't know what to look at here. I'm afraid that the profiler we run tomorrow won't show anything in my code space.

                  mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #28

                  @mzimmers
                  Do you have any timers or threads ?
                  Something scanning for those devices you show ?

                  Also, just for test. a plain normal GUI project with say a ListWidget on it does not show this
                  cpu usage, right?

                  It must somehow be related to your code ?

                  1 Reply Last reply
                  0
                  • mzimmersM mzimmers

                    @mrjj you understand it perfectly, and "odd" is a mild term for it.

                    I seriously don't know what to look at here. I'm afraid that the profiler we run tomorrow won't show anything in my code space.

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #29

                    @mzimmers said in app using "excessive" CPU:

                    I'm afraid that the profiler we run tomorrow won't show anything in my code space.

                    Always with the negative waves https://www.youtube.com/watch?v=KuStsFW4EmQ Have a little faith, baby!

                    1 Reply Last reply
                    1
                    • mzimmersM Offline
                      mzimmersM Offline
                      mzimmers
                      wrote on last edited by
                      #30

                      Well, my associate hasn't yet built the app on Linux, but I discovered the source (if not the cause) of the problem: my logo.

                      I have a small (201x59 pixel) PNG in the upper left of my widget. When I remove it from my .qrc file, the CPU usage disappears.

                      Any ideas on this one?

                      1 Reply Last reply
                      0
                      • fcarneyF Offline
                        fcarneyF Offline
                        fcarney
                        wrote on last edited by
                        #31

                        @mzimmers said in app using "excessive" CPU:

                        my logo

                        Wow! That is all I can say.
                        🍿

                        C++ is a perfectly valid school of magic.

                        1 Reply Last reply
                        0
                        • mzimmersM Offline
                          mzimmersM Offline
                          mzimmers
                          wrote on last edited by
                          #32

                          I suspect it has something to do with this line:

                          painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
                          

                          I don't need to scale it; what do I replace the call to scaled() with?

                          mrjjM J.HilkJ 2 Replies Last reply
                          0
                          • mzimmersM mzimmers

                            I suspect it has something to do with this line:

                            painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
                            

                            I don't need to scale it; what do I replace the call to scaled() with?

                            mrjjM Offline
                            mrjjM Offline
                            mrjj
                            Lifetime Qt Champion
                            wrote on last edited by mrjj
                            #33

                            @mzimmers said in app using "excessive" CPU:

                            painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));

                            painter.drawPixmap(rect(), pixmap());
                            actaully scale it to rect so @Bonnie version is correct.
                            

                            to draw it at original size.

                            or you can simply scale it once outside paintEvent and reuse the scaled version.

                            1 Reply Last reply
                            1
                            • B Offline
                              B Offline
                              Bonnie
                              wrote on last edited by Bonnie
                              #34

                              To not scale at all, should not use a rect as parameter (unless the rect size is the same as the pixmap size).

                              painter.drawPixmap(0, 0, pixmap());
                              

                              (0, 0) is the draw position.

                              1 Reply Last reply
                              1
                              • mzimmersM mzimmers

                                I suspect it has something to do with this line:

                                painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
                                

                                I don't need to scale it; what do I replace the call to scaled() with?

                                J.HilkJ Offline
                                J.HilkJ Offline
                                J.Hilk
                                Moderators
                                wrote on last edited by
                                #35

                                @mzimmers great you found it! But paintEvent itself should not be called that much regularly! I suspect your logo is being resized (wiggles) all the time!


                                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
                                • JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by
                                  #36

                                  @mzimmers
                                  Ah ha! We have been looking for where you "wiggle", I suspect @J-Hilk has found it!?

                                  1 Reply Last reply
                                  0
                                  • mzimmersM Offline
                                    mzimmersM Offline
                                    mzimmers
                                    wrote on last edited by mzimmers
                                    #37

                                    Thank you all for the replies. I tried mrjj's/Bonnie's suggestions, and they didn't change the CPU usage.

                                    But really, the question (IMO) is WHY is my logo being wiggled? I have matched the dimensions of the .png file to the QWidget (a QLabel) that displays it. I've set the QLabel's size to fixed. What could be causing this flood of paint events?

                                    The technique I'm using is to promote the QLabel to a class I've created (LogoLabel). Here's the entirety of its paint event:

                                    void LogoLabel::paintEvent(QPaintEvent *event)
                                    {
                                        Q_UNUSED(event)
                                        QPainter painter(this);
                                        const QString filename(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png");
                                    
                                        bool rc;
                                    
                                        rc = m_pixmap.load(filename);
                                        if (rc)
                                        {
                                            setPixmap(m_pixmap);
                                            Qt::KeepAspectRatio, Qt::SmoothTransformation));
                                            painter.drawPixmap(0, 0, *pixmap());
                                        }
                                    }
                                    
                                    B 1 Reply Last reply
                                    0
                                    • O Offline
                                      O Offline
                                      ollarch
                                      wrote on last edited by
                                      #38

                                      Hi,

                                      You could reimplement "reseizeEvent" and do the Pixmap scale there. On "paintEvent", just paint it or just set the pixmap to the Label and it will paint it.

                                      1 Reply Last reply
                                      0
                                      • mzimmersM mzimmers

                                        Thank you all for the replies. I tried mrjj's/Bonnie's suggestions, and they didn't change the CPU usage.

                                        But really, the question (IMO) is WHY is my logo being wiggled? I have matched the dimensions of the .png file to the QWidget (a QLabel) that displays it. I've set the QLabel's size to fixed. What could be causing this flood of paint events?

                                        The technique I'm using is to promote the QLabel to a class I've created (LogoLabel). Here's the entirety of its paint event:

                                        void LogoLabel::paintEvent(QPaintEvent *event)
                                        {
                                            Q_UNUSED(event)
                                            QPainter painter(this);
                                            const QString filename(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png");
                                        
                                            bool rc;
                                        
                                            rc = m_pixmap.load(filename);
                                            if (rc)
                                            {
                                                setPixmap(m_pixmap);
                                                Qt::KeepAspectRatio, Qt::SmoothTransformation));
                                                painter.drawPixmap(0, 0, *pixmap());
                                            }
                                        }
                                        
                                        B Offline
                                        B Offline
                                        Bonnie
                                        wrote on last edited by Bonnie
                                        #39

                                        @mzimmers Why are you doing the loading in the paintEvent???

                                        void LogoLabel::paintEvent(QPaintEvent *event)
                                        {
                                            Q_UNUSED(event)
                                             //m_pixmap should already be loaded
                                            if (!m_pixmap.isNull())
                                            {
                                                QPainter painter(this);
                                                painter.drawPixmap(0, 0, m_pixmap);
                                            }
                                        }
                                        

                                        I remembered you had a post said you write your label class because you want the QLabel to scale smoother.
                                        Now, if you do not need to scale, you only need to load the pixmap once after it is created.

                                        label.setPixmap(QPixmap(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png"));
                                        

                                        If you still need to scale, I think you should scale it in the resizeEvent.

                                        void LogoLabel::resizeEvent(QResize*event)
                                        {
                                            QLabel::resizeEvent(event);
                                            if(QPixmap *pix = pixmap())
                                                m_pixmap = pix->scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
                                        }
                                        

                                        Actually, I don't think you need to subclass QLabel...Subclassing QWidget is enough if you reimplement all these events...

                                        mzimmersM 1 Reply Last reply
                                        4
                                        • B Bonnie

                                          @mzimmers Why are you doing the loading in the paintEvent???

                                          void LogoLabel::paintEvent(QPaintEvent *event)
                                          {
                                              Q_UNUSED(event)
                                               //m_pixmap should already be loaded
                                              if (!m_pixmap.isNull())
                                              {
                                                  QPainter painter(this);
                                                  painter.drawPixmap(0, 0, m_pixmap);
                                              }
                                          }
                                          

                                          I remembered you had a post said you write your label class because you want the QLabel to scale smoother.
                                          Now, if you do not need to scale, you only need to load the pixmap once after it is created.

                                          label.setPixmap(QPixmap(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png"));
                                          

                                          If you still need to scale, I think you should scale it in the resizeEvent.

                                          void LogoLabel::resizeEvent(QResize*event)
                                          {
                                              QLabel::resizeEvent(event);
                                              if(QPixmap *pix = pixmap())
                                                  m_pixmap = pix->scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
                                          }
                                          

                                          Actually, I don't think you need to subclass QLabel...Subclassing QWidget is enough if you reimplement all these events...

                                          mzimmersM Offline
                                          mzimmersM Offline
                                          mzimmers
                                          wrote on last edited by
                                          #40

                                          @Bonnie you nailed it. I moved the load to the c'tor, and everything works much better now.

                                          A couple of notes:

                                          1. I turned on my event filter, and it's no longer spewing zillions of events, so I guess my keyPress idea would have worked (if Windows wasn't so lame).
                                          2. I tried making my painter a member variable and initializing it in the c'tor, but that didn't work. Any idea why?

                                          Thanks to everyone who looked at this.

                                          B jsulmJ 2 Replies Last reply
                                          0

                                          • Login

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