Thread aus Objekt heraus erzeugen. Scope?



  • Hallo zusammen,

    ... und ein froher Gruss erstmal in die Runde!

    Schon eine Weile beschäftigt mich ein Problem, für dass ich keine Lösung finde.
    Google to the max und Rumprobieren brachten auch nichts.

    Code: http://pastebin.com/d4c0fb65c

    Ich möchte im Konstruktur meiner Klasse beim Aufrufen gerne einen Thread erzeugen.
    Leider bekomme ich einen Kompilierungsfehler für pthread_create()

    Fehler: Argument des Typs »void (IpCam::)(void*)« passt nicht zu »void* ()(void)« ipcam.cpp: In function »void* capture_thread(void*)«:*

    Wenn ich das dritte Argument abändere zu ...

    rc = pthread_create(&threads[t], NULL, &IPCam::capture_thread, param);
    

    ... kann nicht zum gewünschten Datentyp gecastet werden.

    Fehler: »void (IpCam::)(void)« kann nicht nach »void* ()(void)« für Argument »3« nach »int pthread_create(pthread_t*, const pthread_attr_t*, void* ()(void), void*)« umgewandelt werden*

    Würde mich sehr freuen, falls jemand meinen Denkknoten lösen kann.

    Danke und Gruss,
    Dude

    PS: (Muss ich gcc zwingend ein "--pthread" Flag mitgeben?)


  • Administrator

    Ich verweise jetzt einfach nur auf meinem Post in Thread nebenan:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1719867.html#1719867

    Haben wir keinen FAQ Eintrag für diese Methodenzeiger? Die Frage kommt ja fast täglich.

    Edit: Vielleicht noch ein Zusatz, an pthread wirst du wohl nur eine statische oder freie Funktion übergeben können.
    Mit Boost.Thread ist dies nicht der Fall:
    http://www.boost.org/doc/libs/1_39_0/doc/html/thread.html

    Boost.Thread ist sowieso optimiert für den C++ Einsatz. Kann man sich allerdings natürlich mit pthread nachbauen, wenn man möchte 😉

    Grüssli


  • Administrator

    LaDispute schrieb:

    Ich probiere es jetzt mal mit BOOST Threads. POSIX Threads wären mir allerdings lieber. Möchte das aber ungern nachbauen haha

    Hmm, warum wären dir POSIX Threads lieber? Boost.Thread kapselt in den meisten Fällen pthread, auf anderen Platformen wo pthread nicht vorhanden ist, werden halt andere Schnittstellen verwendet. Aber für dich bleibt alles gleich und Boost.Thread ist halt wirklich für den C++ Gebrauch gedacht.

    LaDispute schrieb:

    Weißt du ob es mit APR Threads auch dynamisch geht?

    Zuerst müsstest du mir sagen was du unter APR Threads verstehst und danach was du mit dynamisch meinst 😃

    Grüssli



  • Mit APR Threads meine ich dieses fancy Zeug hier:
    http://apr.apache.org/docs/apr/1.2/group__apr__thread__proc.html

    Mit "dynamisch" meinte ich einfach, dass ich den Thread mit einer Methode verknüpfe die mir einen Zeiger liefert statt bspw. einen int. Ungeschickt ausgedrückt, ich weiß.

    Ich check jetzt mal die BOOST lib.

    Danke schonmal!

    PS:
    Etwas Lesenswertes für alle Mitleser
    http://www.fz-juelich.de/jsc/docs/bhb/bhb_html/d0140/chapter_8/section_16.html


  • Administrator

    Habe noch nie mit den APR Threads gearbeitet. Allerdings scheint es ein reines C Interface zu sein. Und ein C Interface kann nunmal nicht mit Zeiger auf Klassenmethoden umgehen, sondern nur mit freien Funktionszeigern oder statischen Klassenfunktionen.

    Und hab kurz nachgeschaut, wir haben einen uralten FAQ Eintrag, um genau zu sein der erste Eintrag in der C++ FAQ überhaupt.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.html

    Man sollte die FAQ mal überarbeiten, jemand lust? 😃 🤡

    Grüssli


Anmelden zum Antworten