Lambda im CreateThread-Aufruf



  • Sers ^^

    folgendes Problem habe ich mit C++11:
    Ich möchte im Aufruf von CreateThread die zu startende Funktion per Lambda definieren:

    CreateThread(0, 0, [] (void* param) {
        while (1) {
            if (GetAsyncKeyState(VK_ESCAPE))
                ExitProcess(0);
        }
    }, 0, 0, 0);
    

    \main.cpp|15|error: invalid user-defined conversion from 'WinMain(HINSTANCE, HINSTANCE, LPSTR, int)::<lambda(void*)>' to 'LPTHREAD_START_ROUTINE {aka long unsigned int (__attribute__((__stdcall__)) )(void)}' [-fpermissive]|

    Hab schon verschiedenstes probiert, komme aber nicht dahinter.

    MFG, DerCoder



  • Schau dir mal an, was die Thread Prozedur für eine Signatur haben muss...

    Abgesehen davon: Falls du MSVC benutzt, brauchst du MSVC 11 und solltest CreateThread sowieso nicht verwenden (sofern du die CRT benutzt) sondern _beginthread(ex).



  • Ne, ich benutze mingw 4.7.

    Und ich kenne Lambdas erst seit gestern und hab daher eher weniger Ahnung, wie ich den Lambda-Functor gestalten muss.





  • Hilft mir nicht weiter, trotzdem thx.



  • Um CreateThread(..) als Thread Function eine Lambda Funktion übergeben zu können muss mindestens eine Konvertierung von Lambda nach Functionpointer möglich sein. Dies ist in C++ 11 der Fall, jedoch von VS2010 SP1 noch nicht implementiert.

    Diese Konvertierung ist mindestens nötig, desweiteren müsste die Calling Convention (WINAPI wird von CreateThread verlangt) auch setzbar sein - was ich im Moment bezweifle dass das möglich sein wird.

    Der Rede kurzer Sinn: Es geht nicht was Du vorhast (Edit: Diese Aussage bezieht sich auf VS2010 SP1, ich vermute jedoch das bei mingw dasselbe Problem besteht).

    Edit:
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3043.html


Log in to reply