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 can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop
Forum Updated to NodeBB v4.3 + New Features

How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop

Scheduled Pinned Locked Moved Unsolved General and Desktop
21 Posts 4 Posters 1.7k Views 1 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.
  • I imene

    @mpergand is "_counter++" an integer ?
    in my case for(i=0, i< selection.count(), i++) so selection.count()=_counter?
    and what _currentState takes initially ?

    insteed of

    for(int i=0; i< selection.count(); i++)
    

    i will put

    while(_counter!=0){_counter--}
    
    M Offline
    M Offline
    mpergand
    wrote on last edited by
    #8

    @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

    while(_counter!=0){_counter--}

    You can't have a loop, neither for nor while.
    To eliminate the counter variable, you can put all the process informations you have to send in a queue (ex: QQueue) and call nextstep untill the queue is empty.

    QQueue _proceedInfo;  // instance variable
    ...
      void proceedNextStep()  // slot
        {
            if(_processInfo.empty()) return; // no more process
            
            // do step work
            QString info=_processInfo.dequeue();
            
            if(info=="F12B"))  // special case
                {
                QTimer::singleShot(6000,this, [this]()
                    {
                    // long delay timeout
                    ...
                    // next step
                    QTimer::singleShot(0,this, proceedNextStep);
                    });
                
                return;
                }
            
            // do other process
            ...
            
            // proceed next step
            QTimer::singleShot(0,this, proceedNextStep);
        }
    
    1 Reply Last reply
    0
    • I Offline
      I Offline
      imene
      wrote on last edited by imene
      #9

      @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

      for(int i=0; i< selection.count(); i++)

      @mpergand can i fill QQueue _proceedInfo this way ?

      QQueue _proceedInfo;
      for(int i=0; i< selection.count(); i++) 
      {
        _proceedInfo=i;
       }
      
       void proceedNextStep()  // slot
          {
              if(_processInfo.empty()) return; // no more process
              
              // do step work
              QString info=_processInfo.dequeue();
              
              if(info=="F12B"))  // special case
                  {
                  QTimer::singleShot(6000,this, [this]()
                      {
                      // long delay timeout
                      ...
                      // next step
                      QTimer::singleShot(0,this, proceedNextStep);
                      });
                  
                  return;
                  }
              
              // do other process
              ...
              
              // proceed next step
              QTimer::singleShot(0,this, proceedNextStep);
          }
      

      and look what i get here:
      45c6c274-d091-4031-81a3-dba8af013621-image.png

      jsulmJ M 2 Replies Last reply
      0
      • I imene

        @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

        for(int i=0; i< selection.count(); i++)

        @mpergand can i fill QQueue _proceedInfo this way ?

        QQueue _proceedInfo;
        for(int i=0; i< selection.count(); i++) 
        {
          _proceedInfo=i;
         }
        
         void proceedNextStep()  // slot
            {
                if(_processInfo.empty()) return; // no more process
                
                // do step work
                QString info=_processInfo.dequeue();
                
                if(info=="F12B"))  // special case
                    {
                    QTimer::singleShot(6000,this, [this]()
                        {
                        // long delay timeout
                        ...
                        // next step
                        QTimer::singleShot(0,this, proceedNextStep);
                        });
                    
                    return;
                    }
                
                // do other process
                ...
                
                // proceed next step
                QTimer::singleShot(0,this, proceedNextStep);
            }
        

        and look what i get here:
        45c6c274-d091-4031-81a3-dba8af013621-image.png

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

        @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

        can i fill QQueue _proceedInfo this way ?

        Please read documentation: https://doc.qt.io/qt-6/qqueue.html
        To add elements to the queue you call enqueue() as shown there.

        Regarding error: what you are doing is wrong. When you call singleShot you do NOT call the member function but pass its address:

        QTimer::singleShot(100, this, &MainWindow::processStep);
        

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

        1 Reply Last reply
        1
        • I imene

          @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

          for(int i=0; i< selection.count(); i++)

          @mpergand can i fill QQueue _proceedInfo this way ?

          QQueue _proceedInfo;
          for(int i=0; i< selection.count(); i++) 
          {
            _proceedInfo=i;
           }
          
           void proceedNextStep()  // slot
              {
                  if(_processInfo.empty()) return; // no more process
                  
                  // do step work
                  QString info=_processInfo.dequeue();
                  
                  if(info=="F12B"))  // special case
                      {
                      QTimer::singleShot(6000,this, [this]()
                          {
                          // long delay timeout
                          ...
                          // next step
                          QTimer::singleShot(0,this, proceedNextStep);
                          });
                      
                      return;
                      }
                  
                  // do other process
                  ...
                  
                  // proceed next step
                  QTimer::singleShot(0,this, proceedNextStep);
              }
          

          and look what i get here:
          45c6c274-d091-4031-81a3-dba8af013621-image.png

          M Offline
          M Offline
          mpergand
          wrote on last edited by mpergand
          #11

          @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

          can i fill QQueue _proceedInfo this way ?

          QQueue is a tempate class, see the doc.

          try: QTimer::singleShot(0,this, SLOT(proceedNextStep));
          Remember what i write is pseudo code.

          1 Reply Last reply
          0
          • I Offline
            I Offline
            imene
            wrote on last edited by
            #12

            @jsulm
            i found this code here https://doc.qt.io/qt-6/qqueue.html

            QQueue<int> queue;
            queue.enqueue(1);
            queue.enqueue(2);
            queue.enqueue(3);
            

            i fixe it this way:

            QQueue<int>  _proceedInfo;
            for(int i=0; i< selection.count(); i++) 
            {
              _proceedInfo.enqueue(i);
             }
            
            1 Reply Last reply
            0
            • I Offline
              I Offline
              imene
              wrote on last edited by imene
              #13

              @mpergand in this case in your code :

              QQueue _proceedInfo;  // instance variable
              ...
                void proceedNextStep()  // slot
                  {
                      if(_processInfo.empty()) return; // no more process
                      
                      // do step work
                      QString info=_processInfo.dequeue();
                      
                      if(info=="F12B"))  // special case
                          {
                          QTimer::singleShot(6000,this, [this]()
                              {
                              // long delay timeout
                              ...
                              // next step
                              QTimer::singleShot(0,this, proceedNextStep);
                              });
                          
                          return;
                          }
                      
                      // do other process
                      ...
                      
                      // proceed next step
                      QTimer::singleShot(0,this, proceedNextStep);
                  }
              

              No need for enum variable ? they doesn't exist here ?

              M 1 Reply Last reply
              0
              • M mpergand

                @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

                and from where i get "LongDelayTimeOut" is it known by Qt ?

                You have to replace the for loop with a counter and to define the different states you need:

                enum
                {
                Proceed_next,
                LongDelayTimeOut,
                ...
                
                }
                

                as well as an instance variable to store the current operation status:

                if(_currentState==LongDelayTimeOut)
                    {
                     // long delay ending
                    }
                else if(_currentState==Proceed_next)
                   {
                   _counter++;
                // get next payload
                if (PayloadData_R=="F12B")
                   {
                   _currentState=LongDelayTimeOut;
                     QTimer::singleShot(6000, this, proceedNextStep);
                      return;
                   }
                
                    // next payload
                   _currentState=Proceed_next; // default state
                   QTimer::singleShot(100,this, proceedNextStep);
                    }
                
                   }
                

                Keep in mind that you need to know what to do each time proceedNext is call, so you need to carefuly define the different states of the current operation.

                I Offline
                I Offline
                imene
                wrote on last edited by
                #14

                @mpergand is this code have to be inside void proceedNextStep(){...} ?

                if(_currentState==LongDelayTimeOut)
                    {
                     // long delay ending
                    }
                else if(_currentState==Proceed_next)
                   {
                   _counter++;
                // get next payload
                if (PayloadData_R=="F12B")
                   {
                   _currentState=LongDelayTimeOut;
                     QTimer::singleShot(6000, this, proceedNextStep);
                      return;
                   }
                
                    // next payload
                   _currentState=Proceed_next; // default state
                   QTimer::singleShot(100,this, proceedNextStep);
                    }
                
                   }
                
                1 Reply Last reply
                0
                • I imene

                  @mpergand in this case in your code :

                  QQueue _proceedInfo;  // instance variable
                  ...
                    void proceedNextStep()  // slot
                      {
                          if(_processInfo.empty()) return; // no more process
                          
                          // do step work
                          QString info=_processInfo.dequeue();
                          
                          if(info=="F12B"))  // special case
                              {
                              QTimer::singleShot(6000,this, [this]()
                                  {
                                  // long delay timeout
                                  ...
                                  // next step
                                  QTimer::singleShot(0,this, proceedNextStep);
                                  });
                              
                              return;
                              }
                          
                          // do other process
                          ...
                          
                          // proceed next step
                          QTimer::singleShot(0,this, proceedNextStep);
                      }
                  

                  No need for enum variable ? they doesn't exist here ?

                  M Offline
                  M Offline
                  mpergand
                  wrote on last edited by mpergand
                  #15

                  @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

                  No need for enum variable ?

                  Yes if it is all you have to do.

                  I still don't understand why you want to store number instead of the data you really need:

                  QString PayloadData_R = m_ui->Table_CSV->model()->data(m_ui->Table_CSV->model()->index(b,1)).toString();

                  Put that string directly in the queue.

                  I 1 Reply Last reply
                  0
                  • M mpergand

                    @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

                    No need for enum variable ?

                    Yes if it is all you have to do.

                    I still don't understand why you want to store number instead of the data you really need:

                    QString PayloadData_R = m_ui->Table_CSV->model()->data(m_ui->Table_CSV->model()->index(b,1)).toString();

                    Put that string directly in the queue.

                    I Offline
                    I Offline
                    imene
                    wrote on last edited by imene
                    #16

                    @mpergand Because i need "b" inside index(b,1)
                    i get it this way:

                    for(int i=0; i< selection.count(); i++)
                        {
                            QModelIndex ind = selection.at(i);//at returns item at the index position i
                                 qDebug() << "QModelIndex ind = selection.at(i);" << ind;
                            int a= ind.column(); //Returns the column this model index refers to
                                 qDebug() << "a=" << a;
                            int b= ind.row(); //Returns the row this model index refers to
                                 qDebug() << "b=" << b; //indice ligne
                    
                            //getting data from selected row
                    
                            QString PayloadData_R = m_ui->Table_CSV->model()->data(m_ui->Table_CSV->model()->index(b,1)).toString();
                            qDebug() <<"PayloadData_R sendrow="<<PayloadData_R;
                    
                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mpergand
                      wrote on last edited by
                      #17

                      The idea is to put the data you need in the queue before calling proceedNext:

                      for(int i=0; i< selection.count(); i++)
                          {
                              QModelIndex ind = selection.at(i);//at returns item at the index position i
                          // bla bla
                          _proceedInfo.enqueue(PayloadData_R);
                          }
                      
                      // start sending data
                      proceedNext();
                      
                      1 Reply Last reply
                      0
                      • I Offline
                        I Offline
                        imene
                        wrote on last edited by imene
                        #18

                        I want to put this function inside connect but it don't work;
                        void MainWindow::sendFrame(int i)

                         connect(m_speedTimer,&QTimer::timeout, this, &MainWindow::sendFrame);
                        

                        984e6894-0e6d-4d50-9251-cb8e869d2150-image.png

                        jsulmJ 1 Reply Last reply
                        0
                        • I imene

                          I want to put this function inside connect but it don't work;
                          void MainWindow::sendFrame(int i)

                           connect(m_speedTimer,&QTimer::timeout, this, &MainWindow::sendFrame);
                          

                          984e6894-0e6d-4d50-9251-cb8e869d2150-image.png

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

                          @imene The error is clear, isn't it?
                          The arguments of the signal and slot do not match. You can use a lambda as slot to work around this.

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

                          1 Reply Last reply
                          1
                          • I Offline
                            I Offline
                            imene
                            wrote on last edited by
                            #20

                            This is my sendFrame function how can i pass it as a slot with its parameter that changes each timeout ?

                            class MainWindow : public QMainWindow
                            {
                            ....
                            private slots:
                             void sendFrame(QString IdData_R,QString PayloadData_R,int i);
                            }
                            
                            jsulmJ 1 Reply Last reply
                            0
                            • I imene

                              This is my sendFrame function how can i pass it as a slot with its parameter that changes each timeout ?

                              class MainWindow : public QMainWindow
                              {
                              ....
                              private slots:
                               void sendFrame(QString IdData_R,QString PayloadData_R,int i);
                              }
                              
                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #21

                              @imene said in How can i set time out condition in the timer? Duplicated : https://forum.qt.io/topic/138913/qtimer-make-traitement-out-of-for-loop:

                              how can i pass it as a slot with its parameter that changes each timeout

                              I already told you how: "You can use a lambda as slot to work around this"...

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

                              1 Reply Last reply
                              1

                              • Login

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