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. How to create some Timers at run time and handle them?
Forum Updated to NodeBB v4.3 + New Features

How to create some Timers at run time and handle them?

Scheduled Pinned Locked Moved Solved General and Desktop
qtimer
19 Posts 6 Posters 3.9k 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.
  • Christian EhrlicherC Christian Ehrlicher

    @Jamshid said in How to create some Timers at run time and handle them?:

    So using QTimer with specific slots won't work.

    There is always QObject::sender() where you can see where the signal is coming from. Apart from this why not storing all created timers in a QVector/QHash/whatever so you can access them later on?

    JamshidJ Offline
    JamshidJ Offline
    Jamshid
    wrote on last edited by
    #9

    @Christian-Ehrlicher I'm trying sender(), I can store created timers in a vector and connect all created timers' timeout signal to one slot, my problem is this how to determine in that slot which timer timed out. I think QObject::sender() will help. let me try it.

    J.HilkJ JonBJ 2 Replies Last reply
    0
    • JamshidJ Jamshid

      @Christian-Ehrlicher I'm trying sender(), I can store created timers in a vector and connect all created timers' timeout signal to one slot, my problem is this how to determine in that slot which timer timed out. I think QObject::sender() will help. let me try it.

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

      @Jamshid I would actually suggest to use a lambda over the sender() approach

      for(int i(0); i <10; i++){
              QTimer *t = new QTimer(this);
              connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(i);});
              m_timers.append(t);
         }
      
      ...
      public slots:
          void timerSlot(int timeId);
      

      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.

      JamshidJ 1 Reply Last reply
      0
      • JamshidJ Jamshid

        @Christian-Ehrlicher I'm trying sender(), I can store created timers in a vector and connect all created timers' timeout signal to one slot, my problem is this how to determine in that slot which timer timed out. I think QObject::sender() will help. let me try it.

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

        @Jamshid
        For a slot function sender should give you which timer. My understanding (untested!) is that if you use a lambda you do not get a sender. But then @J-Hilk is, I think, offering a lambda which passes the timerId as a parameter for you. Both sound like they would work.

        J.HilkJ 1 Reply Last reply
        0
        • JonBJ JonB

          @Jamshid
          For a slot function sender should give you which timer. My understanding (untested!) is that if you use a lambda you do not get a sender. But then @J-Hilk is, I think, offering a lambda which passes the timerId as a parameter for you. Both sound like they would work.

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

          @JonB well, yes, we originally talked about identifying the timer that called the slot, what better way than an int ? ๐Ÿ˜‰

          Well, If one is more interested in the Timer Object....

          for(int i(0); i <10; i++){
                  QTimer *t = new QTimer(this);
                  connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(t);});
                  m_timers.append(t);
             }
          
          ...
          public slots:
              void timerSlot(QTimer *timer);
          

          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
          4
          • J.HilkJ J.Hilk

            @Jamshid I would actually suggest to use a lambda over the sender() approach

            for(int i(0); i <10; i++){
                    QTimer *t = new QTimer(this);
                    connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(i);});
                    m_timers.append(t);
               }
            
            ...
            public slots:
                void timerSlot(int timeId);
            
            JamshidJ Offline
            JamshidJ Offline
            Jamshid
            wrote on last edited by Jamshid
            #13

            @J-Hilk I test this code, It only passes the last timer ID.

            if (!List.contains(str))
            {
            // Start timer
            timer = new QTimer(this);
            timer->setInterval(200);
            timer->start();
            connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
            
            //
            timersList.append(timer);
            timersIDList.append(timer->timerId());
            }
            

            void FrameProcessor::integrityTimersEvent(int timerID)
            {
                qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
            }
            

            Am I doing it right way?

            JonBJ J.HilkJ Christian EhrlicherC 4 Replies Last reply
            0
            • JamshidJ Jamshid

              @J-Hilk I test this code, It only passes the last timer ID.

              if (!List.contains(str))
              {
              // Start timer
              timer = new QTimer(this);
              timer->setInterval(200);
              timer->start();
              connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
              
              //
              timersList.append(timer);
              timersIDList.append(timer->timerId());
              }
              

              void FrameProcessor::integrityTimersEvent(int timerID)
              {
                  qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
              }
              

              Am I doing it right way?

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

              @Jamshid , @J-Hilk

              It only passes the last timer ID.

              This is just the kind of behaviour I found when playing with lambdas (which is why I don't much like them, let's not go there)! To get it right, I believe, you must pass the timer->timerID(), or the whole timer, as a parameter to the lambda. Not sure of the C++ (I'm Python) syntax, but I think it must go inside the () you have...

              EDIT Oh well, since @J-Hilk shows it works below, I must be mistaken, sorry.... I had this kind of problem with Python lambdas, they must not directly access a changing value in the caller in their body code, instead the caller must pass that as a parameter....

              1 Reply Last reply
              0
              • JamshidJ Jamshid

                @J-Hilk I test this code, It only passes the last timer ID.

                if (!List.contains(str))
                {
                // Start timer
                timer = new QTimer(this);
                timer->setInterval(200);
                timer->start();
                connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                
                //
                timersList.append(timer);
                timersIDList.append(timer->timerId());
                }
                

                void FrameProcessor::integrityTimersEvent(int timerID)
                {
                    qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                }
                

                Am I doing it right way?

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

                @Jamshid
                should work fine,

                take a look at the example I made:

                int MainWindow::count = 0;
                MainWindow::MainWindow(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::MainWindow)
                {
                    for(int i(0); i <10; i++){
                        QTimer *t = new QTimer(this);
                        connect(t, &QTimer::timeout, this, [=]()->void{timerSlot(t->timerId());});
                        m_timers.append(t);
                        t->start(100);
                   }
                }
                
                void MainWindow::timerSlot(int timerId)
                {
                    qDebug() << timerId;
                    qDebug() << Q_FUNC_INFO << count++;
                }
                

                which results in the correct call of:

                1
                void MainWindow::timerSlot(int) 0
                2
                void MainWindow::timerSlot(int) 1
                3
                void MainWindow::timerSlot(int) 2
                4
                void MainWindow::timerSlot(int) 3
                5
                void MainWindow::timerSlot(int) 4
                6
                void MainWindow::timerSlot(int) 5
                7
                void MainWindow::timerSlot(int) 6
                8
                void MainWindow::timerSlot(int) 7
                9
                void MainWindow::timerSlot(int) 8
                10
                void MainWindow::timerSlot(int) 9
                1
                void MainWindow::timerSlot(int) 10
                2
                void MainWindow::timerSlot(int) 11
                3
                void MainWindow::timerSlot(int) 12
                4
                void MainWindow::timerSlot(int) 13
                5
                void MainWindow::timerSlot(int) 14
                6
                void MainWindow::timerSlot(int) 15
                7
                void MainWindow::timerSlot(int) 16
                8
                void MainWindow::timerSlot(int) 17
                9
                void MainWindow::timerSlot(int) 18
                10
                void MainWindow::timerSlot(int) 19
                1
                void MainWindow::timerSlot(int) 20
                2
                void MainWindow::timerSlot(int) 21
                3
                void MainWindow::timerSlot(int) 22
                4
                void MainWindow::timerSlot(int) 23
                5
                void MainWindow::timerSlot(int) 24
                6
                void MainWindow::timerSlot(int) 25
                7
                void MainWindow::timerSlot(int) 26
                8
                void MainWindow::timerSlot(int) 27
                9
                void MainWindow::timerSlot(int) 28
                10
                void MainWindow::timerSlot(int) 29
                1
                void MainWindow::timerSlot(int) 30
                2
                void MainWindow::timerSlot(int) 31
                3
                void MainWindow::timerSlot(int) 32
                4
                void MainWindow::timerSlot(int) 33
                5
                void MainWindow::timerSlot(int) 34
                6
                void MainWindow::timerSlot(int) 35
                7
                void MainWindow::timerSlot(int) 36
                8
                void MainWindow::timerSlot(int) 37
                9
                void MainWindow::timerSlot(int) 38
                10
                void MainWindow::timerSlot(int) 39
                1
                void MainWindow::timerSlot(int) 40
                2
                void MainWindow::timerSlot(int) 41
                3
                void MainWindow::timerSlot(int) 42
                4
                void MainWindow::timerSlot(int) 43
                5
                void MainWindow::timerSlot(int) 44
                6
                void MainWindow::timerSlot(int) 45
                7
                void MainWindow::timerSlot(int) 46
                8
                void MainWindow::timerSlot(int) 47
                9
                void MainWindow::timerSlot(int) 48
                10
                void MainWindow::timerSlot(int) 49
                1
                void MainWindow::timerSlot(int) 50
                

                edit: @JonB
                the [=] is a "capture everything by copy" indicator. So no explicit capture of the id should be required


                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
                • JamshidJ Jamshid

                  @J-Hilk I test this code, It only passes the last timer ID.

                  if (!List.contains(str))
                  {
                  // Start timer
                  timer = new QTimer(this);
                  timer->setInterval(200);
                  timer->start();
                  connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                  
                  //
                  timersList.append(timer);
                  timersIDList.append(timer->timerId());
                  }
                  

                  void FrameProcessor::integrityTimersEvent(int timerID)
                  {
                      qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                  }
                  

                  Am I doing it right way?

                  Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #16

                  @Jamshid said in How to create some Timers at run time and handle them?:

                  Am I doing it right way?

                  I would guess timer is a member variable, then yes you're doing it wrong. You copy the whole context ( [=]) and therefore the access inside the lambda is 'this->timer'

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  1 Reply Last reply
                  3
                  • JamshidJ Jamshid

                    @J-Hilk I test this code, It only passes the last timer ID.

                    if (!List.contains(str))
                    {
                    // Start timer
                    timer = new QTimer(this);
                    timer->setInterval(200);
                    timer->start();
                    connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                    
                    //
                    timersList.append(timer);
                    timersIDList.append(timer->timerId());
                    }
                    

                    void FrameProcessor::integrityTimersEvent(int timerID)
                    {
                        qDebug() << "integrityTimersEvent => Timer ID:" << timerID;
                    }
                    

                    Am I doing it right way?

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

                    @Jamshid
                    actually this

                    timer = new QTimer(this);
                    timer->setInterval(200);
                    timer->start();
                    connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                    

                    is referencing the member variable

                    try the following:

                    QTimer *t = new QTimer(this);
                    t->setInterval(200);
                    t->start();
                    connect(t, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(t->timerId());});
                    timer = 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.

                    JamshidJ 1 Reply Last reply
                    6
                    • J.HilkJ J.Hilk

                      @Jamshid
                      actually this

                      timer = new QTimer(this);
                      timer->setInterval(200);
                      timer->start();
                      connect(timer, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(timer->timerId());});
                      

                      is referencing the member variable

                      try the following:

                      QTimer *t = new QTimer(this);
                      t->setInterval(200);
                      t->start();
                      connect(t, &QTimer::timeout, this, [=]()->void{integrityTimersEvent(t->timerId());});
                      timer = t;
                      
                      JamshidJ Offline
                      JamshidJ Offline
                      Jamshid
                      wrote on last edited by
                      #18

                      @J-Hilk Thanks a lot, now it works, I'm new to Qt and this topic I think was a little bit advanced for me :)

                      1 Reply Last reply
                      2
                      • JamshidJ Offline
                        JamshidJ Offline
                        Jamshid
                        wrote on last edited by Jamshid
                        #19

                        Thank you all dear friends, thatโ€™s really kind of you.
                        Your help is so appreciated.

                        1 Reply Last reply
                        2

                        • Login

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