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 2.0k 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

    @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