Seite 1 von 1

C++ std::Thread

Verfasst: Mi Mär 05, 2014 1:43 pm
von Chunya
Guten Tag,

hier habe ich ein Problem mit Thread zu erzeugen. In Funktion getPic () möchte ich ein Thread erzeugen mit dem Code “ std::thread first(this.getTime)” , leider funktioniert es nicht. Ich habe mit “ std::thread first(& KameraApp::getTime)” auch versucht, geht es noch nicht. Könnte Jemand vielleicht helfen? Danke im Voraus.

Viele Grüße,
Chunya

Code: Alles auswählen

void KameraApp:: getTime()
{
   // get aktuelle Time;
}

void KameraApp::getPic()
{
   // take photoes
    std::thread first(this.getTime);
    first.join();
}

int  main()
{
   KameraApp KApp;
   KApp.getPic();
}
Edit by cloidnerux: Code tags

Re: C++ std::Thread

Verfasst: Mi Mär 05, 2014 1:47 pm
von oenone
"leider funktioniert es nicht" <-- was erwartest du und was passiert wirklich?

Re: C++ std::Thread

Verfasst: Mi Mär 05, 2014 2:23 pm
von Chunya
Also ich möchte in dem Thread was in die Funktion getTime()steht, ausführen. Bei dem taucht ein syntaxFehler auf.

Re: C++ std::Thread

Verfasst: Mi Mär 05, 2014 3:26 pm
von Lirrec
dein Problem liegt in dieser Zeile:

Code: Alles auswählen

std::thread first(this.getTime);
Du möchtest folgendes:
Dem Thread einen Zeiger auf eine Memberfunktion von KameraApp übergeben, die im Thread ausgeführt werden soll.
Wenn diese Funktion nicht statisch ist, brauchst du dafür auch ein Objekt auf dem die Funktion aufgerufen werden soll.
Dein Objekt ist hier, wie du schon versucht hast this, deine Funktion KameraApp::getTime().

Was dir jetzt noch fehlt ist die richtige Syntax. Mit einem Parameter geht es in diesem Fall leider nicht.
Was du genau brauchst steht z.b. hier:

http://en.cppreference.com/w/cpp/thread/thread/thread

Du brauchst Version (3). Leider ist das etwas umständlich beschrieben, wichtig ist folgender Absatz:
If f is pointer to a member function of class T, then it is called. The return value is ignored. Effectively, the following code is executed:
(t1.*f)(t2, ..., tN) if the type of t1 is either T, reference to T or reference to type derived from T.
((*t1).*f)(t2, ..., tN) otherwise.
Der sagt effektiv, wenn der erste parameter ( f ) ein Pointer auf eine Memberfunktion ist, ruft er den zweiten Parameter ( t1 ) folgendermaßen auf: t1->f() ( vereinfacht, gilt wenn t1 ein Pointer ist, was natürlich für dein "this" der fall ist. ).

Den zweiten Parameter kennst du bereits, this, jetzt musst du nur noch als ersten Parameter den Funktionspointer richtig übergeben:
Die Funktion selbst lautet KameraApp::getTime, und um einen Pointer zu bekommen brauchst du die Adresse davon, also:

Code: Alles auswählen

&KameraApp::getTime
Die Klammern hinter der Funktion brauchst du nur zum tatsächlichen Aufrufen.

Damit habe ich jetzt schon fast alles erklärt, was nötig ist, jetzt solltest du es hinbekommen.
Falls nicht, sag uns, wo du hängst ;)