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.9k 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 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