C++ std::Thread

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Chunya
Beiträge: 16
Registriert: Do Feb 13, 2014 10:22 pm

C++ std::Thread

Beitrag von Chunya » Mi Mär 05, 2014 1:43 pm

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

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: C++ std::Thread

Beitrag von oenone » Mi Mär 05, 2014 1:47 pm

"leider funktioniert es nicht" <-- was erwartest du und was passiert wirklich?

Chunya
Beiträge: 16
Registriert: Do Feb 13, 2014 10:22 pm

Re: C++ std::Thread

Beitrag von Chunya » Mi Mär 05, 2014 2:23 pm

Also ich möchte in dem Thread was in die Funktion getTime()steht, ausführen. Bei dem taucht ein syntaxFehler auf.

Lirrec
Beiträge: 15
Registriert: Mo Feb 20, 2012 11:55 am

Re: C++ std::Thread

Beitrag von Lirrec » Mi Mär 05, 2014 3:26 pm

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 ;)

Antworten