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. Pass a method to QtConcurrent::map
Forum Updated to NodeBB v4.3 + New Features

Pass a method to QtConcurrent::map

Scheduled Pinned Locked Moved Solved General and Desktop
25 Posts 2 Posters 8.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.
  • nulluseN Offline
    nulluseN Offline
    nulluse
    wrote on last edited by
    #13

    I thought so much! At some point I need to get my nose off the ground and look at the assembly listings of my code to really understand behind the scenes. That helped me a lot years ago when I was learning C++ using Stroustrup's 1st book and Borland C++ 2.0 compiler. Unfortunately I ended up doing almost nothing but Delphi and C# ever since and C++ was well forgotten by now.

    Your help and patience with my silly questions is certainly appreciated!

    kshegunovK 1 Reply Last reply
    0
    • nulluseN nulluse

      I thought so much! At some point I need to get my nose off the ground and look at the assembly listings of my code to really understand behind the scenes. That helped me a lot years ago when I was learning C++ using Stroustrup's 1st book and Borland C++ 2.0 compiler. Unfortunately I ended up doing almost nothing but Delphi and C# ever since and C++ was well forgotten by now.

      Your help and patience with my silly questions is certainly appreciated!

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

      @nulluse said:

      Your help and patience with my silly questions is certainly appreciated!

      I certainly wouldn't call them silly, this is pretty specific matter and as I said, in practice it mostly doesn't come up.

      Read and abide by the Qt Code of Conduct

      1 Reply Last reply
      1
      • nulluseN Offline
        nulluseN Offline
        nulluse
        wrote on last edited by
        #15

        When I was using Netbeans with GCC under Linux and FreeBSD, the below lambda declared in a descendant of QDialog worked fine:

        auto func = [ // 96
        	x0 = widget.spX0->value(), // 97
        	y0 = widget.spY0->value(),
        ] (int& iteration) -> int { // 102
        	return iteration;
        };
        

        widget.spX0 etc are the double spin boxes on the dialog.

        But now I tried Qt Creator under Win7 and this lambda is throwing a bunch of errors:

        newform.cpp:97: error: C2143: syntax error : missing ']' before '='
        newform.cpp:97: error: C3481: 'x0': lambda capture variable not found
        newform.cpp:102: error: C2059: syntax error : ']'
        newform.cpp:97: error: C2059: syntax error : '='
        

        Do I need to switch the language version to C++11 anywhere?

        kshegunovK 1 Reply Last reply
        0
        • nulluseN nulluse

          When I was using Netbeans with GCC under Linux and FreeBSD, the below lambda declared in a descendant of QDialog worked fine:

          auto func = [ // 96
          	x0 = widget.spX0->value(), // 97
          	y0 = widget.spY0->value(),
          ] (int& iteration) -> int { // 102
          	return iteration;
          };
          

          widget.spX0 etc are the double spin boxes on the dialog.

          But now I tried Qt Creator under Win7 and this lambda is throwing a bunch of errors:

          newform.cpp:97: error: C2143: syntax error : missing ']' before '='
          newform.cpp:97: error: C3481: 'x0': lambda capture variable not found
          newform.cpp:102: error: C2059: syntax error : ']'
          newform.cpp:97: error: C2059: syntax error : '='
          

          Do I need to switch the language version to C++11 anywhere?

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

          @nulluse said:

          Do I need to switch the language version to C++11 anywhere?

          Depending on the compiler and Qt version, probably, yes. You can add CONFIG += c++11 to your project file and if the compiler supports it it'll be enabled.

          Read and abide by the Qt Code of Conduct

          1 Reply Last reply
          1
          • nulluseN Offline
            nulluseN Offline
            nulluse
            wrote on last edited by
            #17

            That did not help.
            This is what I just downloaded and installed with Qt 5.6 as the only version checked off in the setup:

            Qt Creator 3.6.1
            Based on Qt 5.6.0 (MSVC 2013, 32 bit)
            Built on Mar 14 2016 09:57:09
            From revision d502727b2c
            Copyright 2008-2016 The Qt Company Ltd. All rights reserved.
            The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
            

            It has Desktop Qt 5.6.0 MSVC2013 64bit (default) under the Build&Run/Kits
            Compiler is set to Microsoft Visual C++ Compiler 12.0 (amd64).

            kshegunovK 1 Reply Last reply
            0
            • nulluseN nulluse

              That did not help.
              This is what I just downloaded and installed with Qt 5.6 as the only version checked off in the setup:

              Qt Creator 3.6.1
              Based on Qt 5.6.0 (MSVC 2013, 32 bit)
              Built on Mar 14 2016 09:57:09
              From revision d502727b2c
              Copyright 2008-2016 The Qt Company Ltd. All rights reserved.
              The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
              

              It has Desktop Qt 5.6.0 MSVC2013 64bit (default) under the Build&Run/Kits
              Compiler is set to Microsoft Visual C++ Compiler 12.0 (amd64).

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

              @nulluse
              Hm. It should've worked. As far as I remember VS 2013 should support most of the C++11 features. Could you post the full compile line for the file you're getting the error at?

              PS.
              Also try declaring the variables for the capture explicitly and see how it goes:

              int x0 = widget.spX0->value(), y0 = widget.spY0->value();
              auto func = [ x0, y0] (int& iteration) -> int { // 102
                  return iteration;
              };
              

              Read and abide by the Qt Code of Conduct

              1 Reply Last reply
              1
              • nulluseN Offline
                nulluseN Offline
                nulluse
                wrote on last edited by nulluse
                #19
                14:41:29: Running steps for project MandelbrotQt...
                14:41:29: Configuration unchanged, skipping qmake step.
                14:41:29: Starting: "C:\Qt\Tools\QtCreator\bin\jom.exe" 
                	C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
                	cl -c -nologo -Zc:wchar_t -FS -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -EHsc /Fddebug\MandelbrotQt.pdb -DUNICODE -DWIN32 -DWIN64 -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I..\..\MandelbrotQt -I. -IC:\Qt\5.6\msvc2013_64\include -IC:\Qt\5.6\msvc2013_64\include\QtWidgets -IC:\Qt\5.6\msvc2013_64\include\QtGui -IC:\Qt\5.6\msvc2013_64\include\QtANGLE -IC:\Qt\5.6\msvc2013_64\include\QtCore -Idebug -I. -IC:\Qt\5.6\msvc2013_64\mkspecs\win32-msvc2013 -Fodebug\ @C:\Users\user0\AppData\Local\Temp\newform.obj.11028.16.jom
                newform.cpp
                ..\..\MandelbrotQt\newform.cpp(97) : error C2143: syntax error : missing ']' before '='
                ..\..\MandelbrotQt\newform.cpp(97) : error C3481: 'x0': lambda capture variable not found
                ..\..\MandelbrotQt\newform.cpp(102) : error C2059: syntax error : ']'
                ..\..\MandelbrotQt\newform.cpp(97) : error C2059: syntax error : '='
                ..\..\MandelbrotQt\newform.cpp(102) : error C2143: syntax error : missing ';' before '{'
                ..\..\MandelbrotQt\newform.cpp(105) : error C2065: 'x0' : undeclared identifier
                

                Interesting enough, I started re-factoring the project to move the computations out of the GUI class, and my new class compiles fine when all I capture is [this], then refer to the member variables inside the lambda's body.

                PS: Your workaround works. I will wrap that with #if defined (Q_OS_WIN) etc.

                PPS: But now I am getting lots of linker errors similar to this:

                newform.obj:-1: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QtConcurrent::ThreadEngineBase::ThreadEngineBase(void)" (__imp_??0ThreadEngineBase@QtConcurrent@@QEAA@XZ) referenced in function "public: __cdecl QtConcurrent::IterateKernel<int *,void>::IterateKernel<int *,void>(int *,int *)" (??0?$IterateKernel@PEAHX@QtConcurrent@@QEAA@PEAH0@Z)
                

                Do I need to add linking against a library when working under Windows?

                PPPS: This does not make any sense: I am editing the .pro file adding and removing concurrent from QT but still getting this line in the output every time:

                15:01:05: Configuration unchanged, skipping qmake step.
                
                1 Reply Last reply
                0
                • kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by kshegunov
                  #20

                  @nulluse said:

                  But now I am getting lots of linker errors similar to this:
                  Do I need to add linking against a library when working under Windows?

                  Only to the Qt modules as far as I know. Qt += core gui widgets concurrent etc. It should be working out of the box.

                  Read and abide by the Qt Code of Conduct

                  1 Reply Last reply
                  1
                  • nulluseN Offline
                    nulluseN Offline
                    nulluse
                    wrote on last edited by
                    #21

                    See my last update - adding QT += concurrent does not change anything as the project thinks configuration is not changing.

                    kshegunovK 1 Reply Last reply
                    0
                    • nulluseN nulluse

                      See my last update - adding QT += concurrent does not change anything as the project thinks configuration is not changing.

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

                      @nulluse
                      Sometimes the IDE is not as smart and it doesn't understand the .pro has changed. Run qmake explicitly (somewhere in the build menu) and do a rebuild after that.

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply
                      1
                      • nulluseN Offline
                        nulluseN Offline
                        nulluse
                        wrote on last edited by
                        #23

                        Forcing rebuild does not change anything. The pro file looks like this now:

                        #-------------------------------------------------
                        #
                        # Project created by QtCreator 2016-04-18T13:54:41
                        #
                        #-------------------------------------------------
                        
                        QT += core gui concurrent
                        greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
                        TARGET = MandelbrotQt
                        TEMPLATE = app
                        SOURCES += main.cpp\
                                newform.cpp \
                            helpers/fileHelper.cpp \
                            mandelbrot/mandelbrot.cpp
                        HEADERS  += newform.h \
                            helpers/fileHelper.h \
                            mandelbrot/mandelbrot.h \
                            ui_newForm.h
                        FORMS    += newform.ui
                        LIBS += -lQt5Concurrent
                        CONFIG += c++11
                        

                        The linker is still complaining.

                        kshegunovK 1 Reply Last reply
                        1
                        • nulluseN nulluse

                          Forcing rebuild does not change anything. The pro file looks like this now:

                          #-------------------------------------------------
                          #
                          # Project created by QtCreator 2016-04-18T13:54:41
                          #
                          #-------------------------------------------------
                          
                          QT += core gui concurrent
                          greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
                          TARGET = MandelbrotQt
                          TEMPLATE = app
                          SOURCES += main.cpp\
                                  newform.cpp \
                              helpers/fileHelper.cpp \
                              mandelbrot/mandelbrot.cpp
                          HEADERS  += newform.h \
                              helpers/fileHelper.h \
                              mandelbrot/mandelbrot.h \
                              ui_newForm.h
                          FORMS    += newform.ui
                          LIBS += -lQt5Concurrent
                          CONFIG += c++11
                          

                          The linker is still complaining.

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

                          @nulluse
                          It looks okay to me, with the only exception of this line: LIBS += -lQt5Concurrent. You shouldn't need to pass that to the linker, adding the QT += concurrent is enough (qmake will generate the appropriate include files and linker switches).

                          Read and abide by the Qt Code of Conduct

                          1 Reply Last reply
                          1
                          • nulluseN Offline
                            nulluseN Offline
                            nulluse
                            wrote on last edited by nulluse
                            #25

                            Running qmake fixed it!

                            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