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