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. Low performance, timer and label.
Forum Updated to NodeBB v4.3 + New Features

Low performance, timer and label.

Scheduled Pinned Locked Moved Unsolved General and Desktop
36 Posts 7 Posters 11.6k Views 3 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.
  • VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #8

    Can you try this basic example?

    #include <QApplication>
    #include <QTimer>
    #include <QLabel>
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QLabel mainWid;
        QTimer mainTimer;
        int counter = 0;
        QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid,&counter]()->void{
            mainWid.setText(QObject::tr("%1 sec").arg(++counter));
        });
        mainTimer.start(1000);
        mainWid.show();
        return a.exec();
    }
    

    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
    ~Napoleon Bonaparte

    On a crusade to banish setIndexWidget() from the holy land of Qt

    L 1 Reply Last reply
    3
    • VRoninV VRonin

      Can you try this basic example?

      #include <QApplication>
      #include <QTimer>
      #include <QLabel>
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
          QLabel mainWid;
          QTimer mainTimer;
          int counter = 0;
          QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid,&counter]()->void{
              mainWid.setText(QObject::tr("%1 sec").arg(++counter));
          });
          mainTimer.start(1000);
          mainWid.show();
          return a.exec();
      }
      
      L Offline
      L Offline
      Loc888
      wrote on last edited by
      #9

      @VRonin It says no matching function.

      VRoninV 1 Reply Last reply
      0
      • L Loc888

        @VRonin It says no matching function.

        VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by VRonin
        #10

        @Loc888 I tested it on my machine Qt 5.10 MSVC2013 x64 Win7. What version of Qt are you running?

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        L 1 Reply Last reply
        1
        • VRoninV VRonin

          @Loc888 I tested it on my machine Qt 5.10 MSVC2013 x64 Win7. What version of Qt are you running?

          L Offline
          L Offline
          Loc888
          wrote on last edited by
          #11

          @VRonin Desktop Qt 5.2.0 MinGW 32bit

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by VRonin
            #12

            Then everything should work, you probably just have to enable C++11

            • add CONFIG += c++11 in your .pro file
            • re-run qmake

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            L 1 Reply Last reply
            1
            • VRoninV VRonin

              Then everything should work, you probably just have to enable C++11

              • add CONFIG += c++11 in your .pro file
              • re-run qmake
              L Offline
              L Offline
              Loc888
              wrote on last edited by
              #13

              @VRonin It's working, but i need it in MS. It happens because text need to be updated fast, and it cause the problem. If i just run the timer, it's look's fine, but i need to show the time in label..

              J.HilkJ VRoninV 2 Replies Last reply
              0
              • L Loc888

                @VRonin It's working, but i need it in MS. It happens because text need to be updated fast, and it cause the problem. If i just run the timer, it's look's fine, but i need to show the time in label..

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

                @Loc888 I think you need to be a bit more specific, with what is going on.

                It's working, but i need it in MS. It happens because text need to be updated fast, and it cause the problem. If i just run the timer, it's look's fine, but i need to show the time in label..

                Updating a QLabel's text shouldn't take seconds to update

                to modify the code of @VRonin abit to display time and fast changes:

                #include <QApplication>
                #include <QTimer>
                #include <QLabel>
                #include <QTime>
                
                int main(int argc, char *argv[])
                {
                    QApplication a(argc, argv);
                
                    QLabel mainWid;
                    QTimer mainTimer;
                    QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid]()->void{
                       mainWid.setText(QTime::currentTime().toString("hh.mm.ss.zz"));
                    });
                    mainTimer.start(10);
                    mainWid.show();
                
                    return a.exec();
                }
                

                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.

                L 1 Reply Last reply
                2
                • J.HilkJ J.Hilk

                  @Loc888 I think you need to be a bit more specific, with what is going on.

                  It's working, but i need it in MS. It happens because text need to be updated fast, and it cause the problem. If i just run the timer, it's look's fine, but i need to show the time in label..

                  Updating a QLabel's text shouldn't take seconds to update

                  to modify the code of @VRonin abit to display time and fast changes:

                  #include <QApplication>
                  #include <QTimer>
                  #include <QLabel>
                  #include <QTime>
                  
                  int main(int argc, char *argv[])
                  {
                      QApplication a(argc, argv);
                  
                      QLabel mainWid;
                      QTimer mainTimer;
                      QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid]()->void{
                         mainWid.setText(QTime::currentTime().toString("hh.mm.ss.zz"));
                      });
                      mainTimer.start(10);
                      mainWid.show();
                  
                      return a.exec();
                  }
                  
                  L Offline
                  L Offline
                  Loc888
                  wrote on last edited by
                  #15

                  @J.Hilk I would like to use that, but i don't want current time, i want everything starting from 0.

                  J.HilkJ 1 Reply Last reply
                  0
                  • L Loc888

                    @J.Hilk I would like to use that, but i don't want current time, i want everything starting from 0.

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

                    @Loc888
                    this code examples are for the purpose of trouble shooting.
                    But it's easy enought to adapt.

                    #include <QApplication>
                    #include <QTimer>
                    #include <QLabel>
                    #include <QTime>
                    #include <QElapsedTimer>
                    int main(int argc, char *argv[])
                    {
                        QApplication a(argc, argv);
                    
                        QLabel mainWid;
                        QTimer mainTimer;
                        QTime time(0,0);
                        QElapsedTimer actualTimePassed;
                        QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid, &time, &actualTimePassed]()->void{
                            time = time.addMSecs(actualTimePassed.elapsed());
                            actualTimePassed.start();
                            mainWid.setText(time.toString("hh.mm.ss.zzz"));
                        });
                        actualTimePassed.start();
                        mainTimer.start(10);
                        mainWid.show();
                    
                        return a.exec();
                    }
                    

                    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.

                    L 1 Reply Last reply
                    0
                    • L Loc888

                      @VRonin It's working, but i need it in MS. It happens because text need to be updated fast, and it cause the problem. If i just run the timer, it's look's fine, but i need to show the time in label..

                      VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by VRonin
                      #17

                      @Loc888 said in Low performance, timer and label.:

                      it's working, but i need it in MS

                      Unfortunately this is platform dependant. Best you could do is:

                      #include <QApplication>
                      #include <QTimer>
                      #include <QLabel>
                      
                      int main(int argc, char *argv[])
                      {
                          QApplication a(argc, argv);
                          QLabel mainWid;
                          QTimer mainTimer;
                          mainTimer.setTimerType(Qt::PreciseTimer);
                          unsigned int counter = 0;
                          QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid,&counter]()->void{
                              mainWid.setText(QObject::tr("%1 msec").arg(++counter));
                              mainWid.repaint();
                          });
                          mainTimer.start(1);
                          mainWid.show();
                          return a.exec();
                      }
                      

                      Please note, from http://doc.qt.io/qt-5/qt.html#TimerType-enum:

                      Precise timers try to keep millisecond accuracy

                      try != will, unfortunately

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      L 1 Reply Last reply
                      1
                      • VRoninV VRonin

                        @Loc888 said in Low performance, timer and label.:

                        it's working, but i need it in MS

                        Unfortunately this is platform dependant. Best you could do is:

                        #include <QApplication>
                        #include <QTimer>
                        #include <QLabel>
                        
                        int main(int argc, char *argv[])
                        {
                            QApplication a(argc, argv);
                            QLabel mainWid;
                            QTimer mainTimer;
                            mainTimer.setTimerType(Qt::PreciseTimer);
                            unsigned int counter = 0;
                            QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid,&counter]()->void{
                                mainWid.setText(QObject::tr("%1 msec").arg(++counter));
                                mainWid.repaint();
                            });
                            mainTimer.start(1);
                            mainWid.show();
                            return a.exec();
                        }
                        

                        Please note, from http://doc.qt.io/qt-5/qt.html#TimerType-enum:

                        Precise timers try to keep millisecond accuracy

                        try != will, unfortunately

                        L Offline
                        L Offline
                        Loc888
                        wrote on last edited by
                        #18

                        @VRonin Maybe i expressed wrong, but i don't want it in Ms (the total), so 5500 = 5,5s, i want that pattern "mm.ss.zzz" or "mm.ss.zz" , but i want it to start from 0, not from the current time. Is any way to force it? (In sec, ther is no delay when the method update the text).

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

                          @Loc888
                          this code examples are for the purpose of trouble shooting.
                          But it's easy enought to adapt.

                          #include <QApplication>
                          #include <QTimer>
                          #include <QLabel>
                          #include <QTime>
                          #include <QElapsedTimer>
                          int main(int argc, char *argv[])
                          {
                              QApplication a(argc, argv);
                          
                              QLabel mainWid;
                              QTimer mainTimer;
                              QTime time(0,0);
                              QElapsedTimer actualTimePassed;
                              QObject::connect(&mainTimer,&QTimer::timeout,[&mainWid, &time, &actualTimePassed]()->void{
                                  time = time.addMSecs(actualTimePassed.elapsed());
                                  actualTimePassed.start();
                                  mainWid.setText(time.toString("hh.mm.ss.zzz"));
                              });
                              actualTimePassed.start();
                              mainTimer.start(10);
                              mainWid.show();
                          
                              return a.exec();
                          }
                          
                          L Offline
                          L Offline
                          Loc888
                          wrote on last edited by Loc888
                          #19

                          @J.Hilk Guys,i tried J.Hilk code,and it's not working how it should.

                          It doesnt help me, it's working, but if i compare the timer to my windows time, the difference is arround 10s (after 2min test), it's too mutch.

                          Why it's happening?

                          Ps. I tried with "setTimerType(Qt::PreciseTimer);", but still doesn't help...

                          ????????

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            mpergand
                            wrote on last edited by
                            #20

                            My turn ;)

                            QLabel label;
                            label.setGeometry(100,100,200,50);
                             QTimer timer;
                             QTime time;
                            
                             QObject::connect(&timer,&QTimer::timeout,[&time,&label](){
                                QTime elapsed=QTime::fromMSecsSinceStartOfDay(time.elapsed());
                                label.setText(elapsed.toString("mm:ss:zzz"));
                                });
                            
                            time.start();
                            timer.start(100);
                            label.show();
                            
                            L 1 Reply Last reply
                            5
                            • M mpergand

                              My turn ;)

                              QLabel label;
                              label.setGeometry(100,100,200,50);
                               QTimer timer;
                               QTime time;
                              
                               QObject::connect(&timer,&QTimer::timeout,[&time,&label](){
                                  QTime elapsed=QTime::fromMSecsSinceStartOfDay(time.elapsed());
                                  label.setText(elapsed.toString("mm:ss:zzz"));
                                  });
                              
                              time.start();
                              timer.start(100);
                              label.show();
                              
                              L Offline
                              L Offline
                              Loc888
                              wrote on last edited by
                              #21

                              @mpergand

                              It seems you are the winner... Why it's working?

                              I thought it's working, because you set the delay to 100ms, but even if i change it to 1ms, still working 100%.
                              I don't understand why this is working,and the other timers including my, are all retarded... Why it's happening?

                              And that's the text update method fault's, i tried to turn off the update, and just set the last result, and it's 100% accurate.

                              1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                mpergand
                                wrote on last edited by mpergand
                                #22

                                I know by experience that to rely on a timer is all wrong.
                                You must rely on the system clock for good accuracy.

                                And that's the text update method fault's, i tried to turn off the update, and just set the last result, and it's 100% accurate.

                                Refresh 1000 times per sec is a heavy task, it consumes about 20% cpu on my machine and serves nothing.
                                Timers use the event loop and if the computer is doing heavy tasks, timers triggers might be lost.
                                Rely on event loops for a counter is definitely a bad idea.

                                L 2 Replies Last reply
                                0
                                • M mpergand

                                  I know by experience that to rely on a timer is all wrong.
                                  You must rely on the system clock for good accuracy.

                                  And that's the text update method fault's, i tried to turn off the update, and just set the last result, and it's 100% accurate.

                                  Refresh 1000 times per sec is a heavy task, it consumes about 20% cpu on my machine and serves nothing.
                                  Timers use the event loop and if the computer is doing heavy tasks, timers triggers might be lost.
                                  Rely on event loops for a counter is definitely a bad idea.

                                  L Offline
                                  L Offline
                                  Loc888
                                  wrote on last edited by
                                  #23

                                  @mpergand Ok, how i can use it with Start, Stop, and Reset button? Because i am trying to move your code to another project, and work with buttons, but when i start the timer, it doesn't do anything.. Still be on 00:00:000, i run it ones, and it start from the actual minutes and seconds, then i modified your code to force it start from 0, and i broke something, now nothing is working...

                                  1 Reply Last reply
                                  0
                                  • M mpergand

                                    I know by experience that to rely on a timer is all wrong.
                                    You must rely on the system clock for good accuracy.

                                    And that's the text update method fault's, i tried to turn off the update, and just set the last result, and it's 100% accurate.

                                    Refresh 1000 times per sec is a heavy task, it consumes about 20% cpu on my machine and serves nothing.
                                    Timers use the event loop and if the computer is doing heavy tasks, timers triggers might be lost.
                                    Rely on event loops for a counter is definitely a bad idea.

                                    L Offline
                                    L Offline
                                    Loc888
                                    wrote on last edited by
                                    #24

                                    @mpergand Ok, nevermind, i am blind sometimes... I fix it.

                                    I find the way to restart it, but i have some problems with

                                    " time.fromString("05:00:000"); "

                                    It's not working, how should i use that? Or how to stop the time and the timer, and re-start it again but from the last time? (I dont want to reset it when i press the stop button, and then start).

                                    JKSHJ 1 Reply Last reply
                                    0
                                    • VRoninV Offline
                                      VRoninV Offline
                                      VRonin
                                      wrote on last edited by
                                      #25

                                      You missed an argument and the fact that it's a static function: http://doc.qt.io/qt-5/qtime.html#fromString-1

                                      time = QTime::fromString("05:00:000","mm:ss:zzz");

                                      Have you considered QTimeEdit instead of QLabel?

                                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                      ~Napoleon Bonaparte

                                      On a crusade to banish setIndexWidget() from the holy land of Qt

                                      L 1 Reply Last reply
                                      2
                                      • VRoninV VRonin

                                        You missed an argument and the fact that it's a static function: http://doc.qt.io/qt-5/qtime.html#fromString-1

                                        time = QTime::fromString("05:00:000","mm:ss:zzz");

                                        Have you considered QTimeEdit instead of QLabel?

                                        L Offline
                                        L Offline
                                        Loc888
                                        wrote on last edited by
                                        #26

                                        @VRonin Still reset when i press the start button, and when i stop and start,it starts from 0.
                                        Comon, how to fix that? It's almost fixed.

                                        K 1 Reply Last reply
                                        0
                                        • L Loc888

                                          @VRonin Still reset when i press the start button, and when i stop and start,it starts from 0.
                                          Comon, how to fix that? It's almost fixed.

                                          K Offline
                                          K Offline
                                          koahnig
                                          wrote on last edited by
                                          #27

                                          @Loc888 said in Low performance, timer and label.:

                                          @VRonin Still reset when i press the start button, and when i stop and start,it starts from 0.
                                          Comon, how to fix that? It's almost fixed.

                                          I suggest that you are showing your actual code snippets and explain what you think they should do.

                                          Above there are only code snippets from others, not a single snippet from you. Nobody knows what you have taken over into your code. Therefore nobody can give you sound advice.

                                          Vote the answer(s) that helped you to solve your issue(s)

                                          L 1 Reply Last reply
                                          3

                                          • Login

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