Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Error on QtConcurrent::run
Forum Updated to NodeBB v4.3 + New Features

Error on QtConcurrent::run

Scheduled Pinned Locked Moved Solved Mobile and Embedded
15 Posts 4 Posters 2.7k Views 2 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.
  • P Offline
    P Offline
    peter-70
    wrote on last edited by peter-70
    #1

    What is wrong with these code line:

    QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false)
    

    positionWidget is a instance pointer of PositionGroupbox
    Select is public void with one bool parameter in the class PositionGroupbox

    The compiler shows me an error:

    error: no matching function for call to 'run'
                    synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                                           ^~~~~~~~~~~~~~~~~
    

    Do you know what is wrong with the code?

    KroMignonK J.HilkJ kshegunovK 4 Replies Last reply
    0
    • P peter-70

      What is wrong with these code line:

      QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false)
      

      positionWidget is a instance pointer of PositionGroupbox
      Select is public void with one bool parameter in the class PositionGroupbox

      The compiler shows me an error:

      error: no matching function for call to 'run'
                      synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                                             ^~~~~~~~~~~~~~~~~
      

      Do you know what is wrong with the code?

      KroMignonK Offline
      KroMignonK Offline
      KroMignon
      wrote on last edited by
      #2

      @peter-70 Perhaps you have to enable concurrent in your PRO file:

      QT += concurrent
      

      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

      P 1 Reply Last reply
      0
      • P peter-70

        What is wrong with these code line:

        QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false)
        

        positionWidget is a instance pointer of PositionGroupbox
        Select is public void with one bool parameter in the class PositionGroupbox

        The compiler shows me an error:

        error: no matching function for call to 'run'
                        synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                                               ^~~~~~~~~~~~~~~~~
        

        Do you know what is wrong with the code?

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

        @peter-70 is that a valid overload of run ? If I remember correctly the first paramter has to be a member function not an object.

        I may be wrong however.


        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.

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

          @peter-70 is that a valid overload of run ? If I remember correctly the first paramter has to be a member function not an object.

          I may be wrong however.

          KroMignonK Offline
          KroMignonK Offline
          KroMignon
          wrote on last edited by
          #4

          @J.Hilk This usage is totally legal.

          For example, from Qt documentation => https://doc.qt.io/qt-5/qtconcurrentrun.html

          // call 'QList<QByteArray>  QByteArray::split(char sep) const' in a separate thread
          QByteArray bytearray = "hello world";
          QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
          ...
          QList<QByteArray> result = future.result();
          

          It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

          1 Reply Last reply
          1
          • P peter-70

            What is wrong with these code line:

            QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false)
            

            positionWidget is a instance pointer of PositionGroupbox
            Select is public void with one bool parameter in the class PositionGroupbox

            The compiler shows me an error:

            error: no matching function for call to 'run'
                            synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                                                   ^~~~~~~~~~~~~~~~~
            

            Do you know what is wrong with the code?

            KroMignonK Offline
            KroMignonK Offline
            KroMignon
            wrote on last edited by KroMignon
            #5

            @peter-70 What is the type of synchronizer? It should be QFutureSynchronizer<void> to match PositionGroupbox::Select() signature.

            It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

            P 1 Reply Last reply
            0
            • P peter-70

              What is wrong with these code line:

              QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false)
              

              positionWidget is a instance pointer of PositionGroupbox
              Select is public void with one bool parameter in the class PositionGroupbox

              The compiler shows me an error:

              error: no matching function for call to 'run'
                              synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                                                     ^~~~~~~~~~~~~~~~~
              

              Do you know what is wrong with the code?

              kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by
              #6

              Does PositionGroupbox derive from QWidget directly or indirectly?

              Read and abide by the Qt Code of Conduct

              P 1 Reply Last reply
              0
              • KroMignonK KroMignon

                @peter-70 Perhaps you have to enable concurrent in your PRO file:

                QT += concurrent
                
                P Offline
                P Offline
                peter-70
                wrote on last edited by peter-70
                #7

                @KroMignon said in Error on QtConcurrent::run:

                QT += concurrent

                Good idea, but unfortunately it does not help

                J.HilkJ 1 Reply Last reply
                0
                • P peter-70

                  @KroMignon said in Error on QtConcurrent::run:

                  QT += concurrent

                  Good idea, but unfortunately it does not help

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

                  @peter-70
                  if you forgot QT += concurrent inside your *pro file, you have to do a complete rebuild - deleting build folder running qmake - for it to take effect, after adding it!

                  Did you do that?


                  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.

                  P 1 Reply Last reply
                  0
                  • kshegunovK kshegunov

                    Does PositionGroupbox derive from QWidget directly or indirectly?

                    P Offline
                    P Offline
                    peter-70
                    wrote on last edited by
                    #9

                    @kshegunov

                    Yes, PositionGroupbox derive from QWidget directly. But What does it matter?

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

                      @peter-70
                      if you forgot QT += concurrent inside your *pro file, you have to do a complete rebuild - deleting build folder running qmake - for it to take effect, after adding it!

                      Did you do that?

                      P Offline
                      P Offline
                      peter-70
                      wrote on last edited by
                      #10

                      @J.Hilk At first, I did not do it. Now I've deleted the output folder and the makefile. Then recreate the makefile and invoke rebuild my project. But that does not help either :-(

                      1 Reply Last reply
                      0
                      • KroMignonK KroMignon

                        @peter-70 What is the type of synchronizer? It should be QFutureSynchronizer<void> to match PositionGroupbox::Select() signature.

                        P Offline
                        P Offline
                        peter-70
                        wrote on last edited by peter-70
                        #11

                        @KroMignon

                        It should be QFutureSynchronizer<void> to match PositionGroupbox::Select() signature

                        Yes it is!

                        Here is the code snippet:

                        QFutureSynchronizer<void> synchronizer;
                        
                            while ((rc = position.Fetch()) && rowIndex < itemsCount)
                            {
                                auto p = new Position;
                                p->Copy(&position);
                        
                                auto positionWidget = new PositionGroupbox(p, this);
                                p->SetContainer(positionWidget);
                        
                                synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                        
                        KroMignonK 1 Reply Last reply
                        0
                        • P peter-70

                          @KroMignon

                          It should be QFutureSynchronizer<void> to match PositionGroupbox::Select() signature

                          Yes it is!

                          Here is the code snippet:

                          QFutureSynchronizer<void> synchronizer;
                          
                              while ((rc = position.Fetch()) && rowIndex < itemsCount)
                              {
                                  auto p = new Position;
                                  p->Copy(&position);
                          
                                  auto positionWidget = new PositionGroupbox(p, this);
                                  p->SetContainer(positionWidget);
                          
                                  synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false));
                          
                          KroMignonK Offline
                          KroMignonK Offline
                          KroMignon
                          wrote on last edited by
                          #12

                          @peter-70 This sound very strange to me.

                          I have used QtConcurrent::run() and never run in this error.

                          I think you have include header:

                          #include <QtConcurrent/QtConcurrent>
                          

                          Can you show the declaration of PositionGroupbox::Select?

                          It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                          P 1 Reply Last reply
                          0
                          • KroMignonK KroMignon

                            @peter-70 This sound very strange to me.

                            I have used QtConcurrent::run() and never run in this error.

                            I think you have include header:

                            #include <QtConcurrent/QtConcurrent>
                            

                            Can you show the declaration of PositionGroupbox::Select?

                            P Offline
                            P Offline
                            peter-70
                            wrote on last edited by peter-70
                            #13

                            @KroMignon

                            Can you show the declaration of PositionGroupbox::Select?

                            Yes, the include is as you write it here. But the declaration of PositionGroupbox::Select is the right question and solution!!!

                            100 points for you! ;-)

                            The declaration is:

                            void Select(bool isSelected, bool refreshColors = false);
                            

                            Now I call

                            synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false, false));
                            

                            and everything is ok!

                            @all: Thank you very much! Specially for KroMignon :-)

                            KroMignonK 1 Reply Last reply
                            0
                            • P peter-70

                              @KroMignon

                              Can you show the declaration of PositionGroupbox::Select?

                              Yes, the include is as you write it here. But the declaration of PositionGroupbox::Select is the right question and solution!!!

                              100 points for you! ;-)

                              The declaration is:

                              void Select(bool isSelected, bool refreshColors = false);
                              

                              Now I call

                              synchronizer.addFuture(QtConcurrent::run(positionWidget, &PositionGroupbox::Select, false, false));
                              

                              and everything is ok!

                              @all: Thank you very much! Specially for KroMignon :-)

                              KroMignonK Offline
                              KroMignonK Offline
                              KroMignon
                              wrote on last edited by
                              #14

                              @peter-70 your welcome

                              It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                              1 Reply Last reply
                              1
                              • P peter-70

                                @kshegunov

                                Yes, PositionGroupbox derive from QWidget directly. But What does it matter?

                                kshegunovK Offline
                                kshegunovK Offline
                                kshegunov
                                Moderators
                                wrote on last edited by
                                #15

                                @peter-70 said in Error on QtConcurrent::run:

                                Yes, PositionGroupbox derive from QWidget directly. But What does it matter?

                                It matters quite a lot. QWidget is not thread-safe and it's not reentrant. You can't touch anything QWidget-y outside the GUI thread, including creating the actual object. Failing to observe this is a race condition and ultimately a bug. That is to say, you have bigger problems than a syntax error.

                                Read and abide by the Qt Code of Conduct

                                1 Reply Last reply
                                3

                                • Login

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