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

    @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