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. Does a loop continue running even if Signals and slot is not complete?
Forum Updated to NodeBB v4.3 + New Features

Does a loop continue running even if Signals and slot is not complete?

Scheduled Pinned Locked Moved Solved General and Desktop
21 Posts 5 Posters 4.0k Views
  • 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.
  • jsulmJ jsulm

    @GCDX I just tried this code:

    connect(this, SIGNAL(somethingHappend()), this, SLOT(doSomething()));
    for (int i = 0; i < 2; ++i) {
        qDebug() << i;
        emit somethingHappend();
    }
    
    void MainWindow::doSomething()
    {
        qDebug() << "do something";
    }
    

    Output was as expected:
    0
    do something
    1
    do something

    G Offline
    G Offline
    GCDX
    wrote on last edited by
    #12

    @jsulm hmmm yup thanks i found my error but i don't know how to fix it.
    void MainWindow::on_pushButton_clicked()
    {
    QString modules=stringpath;
    QUrl url2(modules);
    innerPage->setUrl(url2);//innerpage is a QWebview
    connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));
    }

    void MainWindow::parse(bool)
    {
    QWebFrame *frameInner = innerPage->page()->mainFrame();
    QWebElement doc = frameInner->documentElement();
    QString json=doc.toPlainText();
    //parsing code
    print("parsing executed");
    }

    i realised i put on_pushButton_clicked in a loop as such:
    int i=0;
    While(i!=2){
    i++;
    print(i)
    on_pushbutton_clicked();
    }
    outcome:
    1
    2
    parsing executed.

    i want parsing so be executed in every loop however i cant seem to be able to solve it?

    J.HilkJ jsulmJ 2 Replies Last reply
    0
    • G GCDX

      @jsulm hmmm yup thanks i found my error but i don't know how to fix it.
      void MainWindow::on_pushButton_clicked()
      {
      QString modules=stringpath;
      QUrl url2(modules);
      innerPage->setUrl(url2);//innerpage is a QWebview
      connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));
      }

      void MainWindow::parse(bool)
      {
      QWebFrame *frameInner = innerPage->page()->mainFrame();
      QWebElement doc = frameInner->documentElement();
      QString json=doc.toPlainText();
      //parsing code
      print("parsing executed");
      }

      i realised i put on_pushButton_clicked in a loop as such:
      int i=0;
      While(i!=2){
      i++;
      print(i)
      on_pushbutton_clicked();
      }
      outcome:
      1
      2
      parsing executed.

      i want parsing so be executed in every loop however i cant seem to be able to solve it?

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

      @GCDX said in Does a loop continue running even if Signals and slot is not complete?:
      ok first of all remove that line from the on_pushButton_clicked and place it in your constructor of MainWindow

      connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));

      otherwise you create additional connections each time you call on_pushButton_clicked.
      -> 2nd time on_pushButton_clicked is called -> parse is called twice
      -> 3ed timeon_pushButton_clicked is called -> parse is called 3 times
      etc.

      2nd, make a container, QList or QVector for example, that contains all of your targeted urls, create a member variable cnt to help you navigate through the container.

      in on pushbutton clicked you set cnt to 0 and start loading the first url.

      on load finished, you increase cnt by 1, check if its still smaler that your url list. If it is, load next one, if not, your're done.


      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
      • G GCDX

        @jsulm hmmm yup thanks i found my error but i don't know how to fix it.
        void MainWindow::on_pushButton_clicked()
        {
        QString modules=stringpath;
        QUrl url2(modules);
        innerPage->setUrl(url2);//innerpage is a QWebview
        connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));
        }

        void MainWindow::parse(bool)
        {
        QWebFrame *frameInner = innerPage->page()->mainFrame();
        QWebElement doc = frameInner->documentElement();
        QString json=doc.toPlainText();
        //parsing code
        print("parsing executed");
        }

        i realised i put on_pushButton_clicked in a loop as such:
        int i=0;
        While(i!=2){
        i++;
        print(i)
        on_pushbutton_clicked();
        }
        outcome:
        1
        2
        parsing executed.

        i want parsing so be executed in every loop however i cant seem to be able to solve it?

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

        @GCDX This is easy: MainWindow::parse(bool) will be called as soon as innerPage emits the signal loadFinished, it does not care about your loop. In fact your while() loop is blocking the event loop, so MainWindow::parse(bool) will NOT be called as long as your loop is running.

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

        1 Reply Last reply
        0
        • G Offline
          G Offline
          GCDX
          wrote on last edited by
          #15

          @jsulm how do a rewrite it so that it will work???

          @J-Hilk my method is what you describe which doesn't work! something is preventing the parse from running until the while loop is completed

          jsulmJ J.HilkJ 2 Replies Last reply
          0
          • G GCDX

            @jsulm how do a rewrite it so that it will work???

            @J-Hilk my method is what you describe which doesn't work! something is preventing the parse from running until the while loop is completed

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

            @GCDX said in Does a loop continue running even if Signals and slot is not complete?:

            how do a rewrite it so that it will work???

            I don't understand what you actually want to achieve.
            I don't understand why you call on_pushbutton_clicked() inside the loop.
            If you want to call something immediately inside the loop then simply call the method instead of emitting a signal.

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

            1 Reply Last reply
            0
            • G GCDX

              @jsulm how do a rewrite it so that it will work???

              @J-Hilk my method is what you describe which doesn't work! something is preventing the parse from running until the while loop is completed

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

              @GCDX said in Does a loop continue running even if Signals and slot is not complete?:

              something is preventing the parse from running

              Yes, your while loop! What I describted eleminates the loop and manages the next url just, when the first parse is done


              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
              • G Offline
                G Offline
                GCDX
                wrote on last edited by
                #18

                @J-Hilk but don't you still need a for loop to execute what you said?

                J.HilkJ 1 Reply Last reply
                0
                • G GCDX

                  @J-Hilk but don't you still need a for loop to execute what you said?

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

                  @GCDX
                  untested of course.

                  MainWindow::MainWindow(...){
                      ....
                      connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));
                      urlList = QList<QUrl> ({QUrl("Url1"), QUrl("Url"), ...});
                  }
                  
                  void MainWindow::continue(){
                       if(cnt < urlList.size()){
                           innerPage->setUrl(urlList.at(cnt));      
                           print(cnt); 
                       } 
                  }
                  
                  void MainWindow::on_pushButton_clicked()
                  {
                     cnt = 0;
                     continue();
                  }
                  
                  void MainWindow::parse(bool)
                  {
                  QWebFrame *frameInner = innerPage->page()->mainFrame();
                  QWebElement doc = frameInner->documentElement();
                  QString json=doc.toPlainText();
                  //parsing code
                  print("parsing executed");
                     continue();
                  }
                  }
                  

                  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.

                  6thC6 1 Reply Last reply
                  3
                  • G Offline
                    G Offline
                    GCDX
                    wrote on last edited by
                    #20

                    @J-Hilk wow it works, thanks a lot, its a very smart solution that i would never have thought of!!! Thanks so much :)

                    1 Reply Last reply
                    0
                    • J.HilkJ J.Hilk

                      @GCDX
                      untested of course.

                      MainWindow::MainWindow(...){
                          ....
                          connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));
                          urlList = QList<QUrl> ({QUrl("Url1"), QUrl("Url"), ...});
                      }
                      
                      void MainWindow::continue(){
                           if(cnt < urlList.size()){
                               innerPage->setUrl(urlList.at(cnt));      
                               print(cnt); 
                           } 
                      }
                      
                      void MainWindow::on_pushButton_clicked()
                      {
                         cnt = 0;
                         continue();
                      }
                      
                      void MainWindow::parse(bool)
                      {
                      QWebFrame *frameInner = innerPage->page()->mainFrame();
                      QWebElement doc = frameInner->documentElement();
                      QString json=doc.toPlainText();
                      //parsing code
                      print("parsing executed");
                         continue();
                      }
                      }
                      
                      6thC6 Offline
                      6thC6 Offline
                      6thC
                      wrote on last edited by
                      #21

                      @J.Hilk said in Does a loop continue running even if Signals and slot is not complete?:

                      connect(innerPage, SIGNAL(loadFinished(bool)), SLOT(parse(bool)));

                      well there you go - I mean, I'd have expected that to be just fine in the new syntax but there it is specifying SIGNAL and SLOT too =) - that's new to me.

                      1 Reply Last reply
                      0

                      • Login

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