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
Forum Updated to NodeBB v4.3 + New Features

app using "excessive" CPU

Scheduled Pinned Locked Moved Solved General and Desktop
42 Posts 10 Posters 6.8k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #7

    Hi,

    Are the columns automatically resized to content ?

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    mzimmersM 1 Reply Last reply
    0
    • SGaistS SGaist

      Hi,

      Are the columns automatically resized to content ?

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

      @SGaist not explicitly. I do this:

          qhv->setSectionResizeMode(QHeaderView::Stretch);
      

      But disabling that line doesn't reduce CPU noticably.

      JonBJ 1 Reply Last reply
      0
      • mzimmersM mzimmers

        @SGaist not explicitly. I do this:

            qhv->setSectionResizeMode(QHeaderView::Stretch);
        

        But disabling that line doesn't reduce CPU noticably.

        JonBJ Online
        JonBJ Online
        JonB
        wrote on last edited by JonB
        #9

        @mzimmers
        Sit down, grab a coffee & a pack of cigs. Start binary-chopping-commenting-out half your code at a time. It can't be that hard to get to the point where these update requests do not happen... :) For example, first get rid of all hidden columns. Then reduce to fewer columns than the width of the window. With 2 rows. Then no rows and no columns --- does it still happen then?!

        What are you using which gives you those events printed out?

        mzimmersM 1 Reply Last reply
        0
        • JonBJ JonB

          @mzimmers
          Sit down, grab a coffee & a pack of cigs. Start binary-chopping-commenting-out half your code at a time. It can't be that hard to get to the point where these update requests do not happen... :) For example, first get rid of all hidden columns. Then reduce to fewer columns than the width of the window. With 2 rows. Then no rows and no columns --- does it still happen then?!

          What are you using which gives you those events printed out?

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

          @JonB OK, I'll belly up to removing the hidden rows (I was hoping to avoid that).

          I've already sized my widget so that everything is fully displayed.

          I even disconnected the signal that tells the model to update. My tableView is completely empty. And I'm still getting the CPU usage.

          Here's what I use to show me the events:

          bool KeyPress::eventFilter(QObject *obj, QEvent *ev)
          {
              bool rc = false;
              QEvent::Type type;
              static int count = 0;
          
              type = ev->type();
              qDebug() << count++ << QTime::currentTime().toString() << type;
          
              rc = QObject::eventFilter(obj, ev);
              return rc;
          }
          

          It may be noteworthy that disabling this filter entirely doesn't help.

          JonBJ 1 Reply Last reply
          0
          • mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #11

            Hi
            Could you not add a paintEvent handler where you simply call base class but
            then add a break point and that way maybe see how its triggered ?

            mzimmersM 1 Reply Last reply
            1
            • mzimmersM mzimmers

              @JonB OK, I'll belly up to removing the hidden rows (I was hoping to avoid that).

              I've already sized my widget so that everything is fully displayed.

              I even disconnected the signal that tells the model to update. My tableView is completely empty. And I'm still getting the CPU usage.

              Here's what I use to show me the events:

              bool KeyPress::eventFilter(QObject *obj, QEvent *ev)
              {
                  bool rc = false;
                  QEvent::Type type;
                  static int count = 0;
              
                  type = ev->type();
                  qDebug() << count++ << QTime::currentTime().toString() << type;
              
                  rc = QObject::eventFilter(obj, ev);
                  return rc;
              }
              

              It may be noteworthy that disabling this filter entirely doesn't help.

              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by JonB
              #12

              @mzimmers said in app using "excessive" CPU:

              My tableView is completely empty. And I'm still getting the CPU usage.

              Which is the sort of thing which is interesting, so you don't want to waste time looking at resizes. Nonetheless, the events indicate widget updating?

              I had forgotten about your KeyPress and its eventFilter. Get rid of it completely from your code! You don't want to be messing about with your key press stuff from your other thread. Now what's the speed? It ought be still slow, but you never know.

              Then get rid of all your own "event filters". Reintroduce only one at the very top level to debug monitor whatever you need to.

              mzimmersM 1 Reply Last reply
              0
              • mrjjM mrjj

                Hi
                Could you not add a paintEvent handler where you simply call base class but
                then add a break point and that way maybe see how its triggered ?

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

                @mrjj I can do something like this:

                void Widget::paintEvent(QPaintEvent *event)
                {
                    QWidget::paintEvent(event);
                }
                

                But I don't know what kind of meaningful information I can extract from the event argument. (According to the docs, paintEvent() isn't a slot.)

                1 Reply Last reply
                0
                • JonBJ JonB

                  @mzimmers said in app using "excessive" CPU:

                  My tableView is completely empty. And I'm still getting the CPU usage.

                  Which is the sort of thing which is interesting, so you don't want to waste time looking at resizes. Nonetheless, the events indicate widget updating?

                  I had forgotten about your KeyPress and its eventFilter. Get rid of it completely from your code! You don't want to be messing about with your key press stuff from your other thread. Now what's the speed? It ought be still slow, but you never know.

                  Then get rid of all your own "event filters". Reintroduce only one at the very top level to debug monitor whatever you need to.

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

                  @JonB I've gotten rid of all filters, all hidden columns, and have disconnect model updates after I create two rows. I also disabled stretch mode, and expanding policy. Still using 11% CPU.

                  This might be a good time to point out that I "stole" the code for this app from another project, which doesn't have this problem. For the life of me, I can't see what I added that causes this.

                  JonBJ 1 Reply Last reply
                  0
                  • mzimmersM mzimmers

                    @JonB I've gotten rid of all filters, all hidden columns, and have disconnect model updates after I create two rows. I also disabled stretch mode, and expanding policy. Still using 11% CPU.

                    This might be a good time to point out that I "stole" the code for this app from another project, which doesn't have this problem. For the life of me, I can't see what I added that causes this.

                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by JonB
                    #15

                    @mzimmers
                    Try not running your application, or switch the machine off ;-)

                    Given that this is running on Windows, I can't use the profiler built into Creator

                    Does your MSVC/MinGW compiler come with a usable profiler, nothing to do with Qt?

                    In your paintEvent() override @mrjj had in mind for you to try a debugger breakpoint there and look at the stack trace. You will doubtless need to perhaps put a delay/count on the breakpoint, or set it while the app is in the middle of running. I don't actually know whether paint events will show anything interesting on the stack.

                    You can use the top-level eventFilter() to examine most of what's going on, if you have to :( Debug every event's type to file/debug output window for a couple of seconds into your "idle". Search the output, you're probably interested in what you see just before the updating starts, or as it goes along.

                    mzimmersM 1 Reply Last reply
                    0
                    • JonBJ JonB

                      @mzimmers
                      Try not running your application, or switch the machine off ;-)

                      Given that this is running on Windows, I can't use the profiler built into Creator

                      Does your MSVC/MinGW compiler come with a usable profiler, nothing to do with Qt?

                      In your paintEvent() override @mrjj had in mind for you to try a debugger breakpoint there and look at the stack trace. You will doubtless need to perhaps put a delay/count on the breakpoint, or set it while the app is in the middle of running. I don't actually know whether paint events will show anything interesting on the stack.

                      You can use the top-level eventFilter() to examine most of what's going on, if you have to :( Debug every event's type to file/debug output window for a couple of seconds into your "idle". Search the output, you're probably interested in what you see just before the updating starts, or as it goes along.

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

                      @JonB using MinGW, and I don't think it has a profiler. I could look at 3rd party products, but it's probably easier just to have a co-worker build this on Linux, and then run the profiler. (Hopefully the problem will occur on Linux!)

                      Here's the stack trace you mentioned:
                      stack.PNG
                      Maybe you can see something useful in it; I can't.

                      JonBJ 1 Reply Last reply
                      0
                      • mzimmersM mzimmers

                        @JonB using MinGW, and I don't think it has a profiler. I could look at 3rd party products, but it's probably easier just to have a co-worker build this on Linux, and then run the profiler. (Hopefully the problem will occur on Linux!)

                        Here's the stack trace you mentioned:
                        stack.PNG
                        Maybe you can see something useful in it; I can't.

                        JonBJ Online
                        JonBJ Online
                        JonB
                        wrote on last edited by JonB
                        #17

                        @mzimmers
                        An expert may have something to say about the traceback. All I know is it would be nice to know which the QWidget is. Wait, this code is yours for Widget? So which of your widgets is it? If you break more than once, is it always the same widget?

                        I can see QCoreApplication::sendSpontaneousEvent(). You sure you're not "wiggling"? :)

                        (Hopefully the problem will occur on Linux!)

                        Nope... ;-)

                        mzimmersM 1 Reply Last reply
                        0
                        • JonBJ JonB

                          @mzimmers
                          An expert may have something to say about the traceback. All I know is it would be nice to know which the QWidget is. Wait, this code is yours for Widget? So which of your widgets is it? If you break more than once, is it always the same widget?

                          I can see QCoreApplication::sendSpontaneousEvent(). You sure you're not "wiggling"? :)

                          (Hopefully the problem will occur on Linux!)

                          Nope... ;-)

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

                          @JonB yes Widget is my oh-so-creative name for my main QWidget class, which is the only QWidget the app uses (unless you push one of the buttons). So yeah, it's always the same Widget.

                          Someone else mentioned wiggling, but I'm not sure I know what it means. The problem occurs even when the app loses focus, though.

                          And, if you're confident this won't happen on Linux, then maybe the problem isn't in my code space...

                          JonBJ mrjjM 2 Replies Last reply
                          0
                          • mzimmersM mzimmers

                            @JonB yes Widget is my oh-so-creative name for my main QWidget class, which is the only QWidget the app uses (unless you push one of the buttons). So yeah, it's always the same Widget.

                            Someone else mentioned wiggling, but I'm not sure I know what it means. The problem occurs even when the app loses focus, though.

                            And, if you're confident this won't happen on Linux, then maybe the problem isn't in my code space...

                            JonBJ Online
                            JonBJ Online
                            JonB
                            wrote on last edited by
                            #19

                            @mzimmers said in app using "excessive" CPU:

                            And, if you're confident this won't happen on Linux, then maybe the problem isn't in my code space...

                            Noooo, I put a wink --> ;-) <--
                            I absolutely do not know whether it will repro under Linux, if you're lucky it will, I just meant sod's law it won't!

                            1 Reply Last reply
                            0
                            • mzimmersM mzimmers

                              @JonB yes Widget is my oh-so-creative name for my main QWidget class, which is the only QWidget the app uses (unless you push one of the buttons). So yeah, it's always the same Widget.

                              Someone else mentioned wiggling, but I'm not sure I know what it means. The problem occurs even when the app loses focus, though.

                              And, if you're confident this won't happen on Linux, then maybe the problem isn't in my code space...

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

                              @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 1 Reply Last reply
                              0
                              • 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

                                          • Login

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