Forum: PC-Programmierung Memberfunktion als Thread ausführen / Pointer auf Memberfunktion


von A. R. (redegle)


Lesenswert?

Hallo,

ich tu mich gerade mit einem Problem ziemlich schwer. Vielleicht kann 
mir ja jemand helfen. Ich verwende die Thread Biblothek aus Boost in 
C++.

Das klappt bei "einfachen" Sachen auch ganz gut.
1
#include "stdafx.h"
2
#include <boost/thread/thread.hpp>
3
#include <boost/thread/tss.hpp>
4
5
void helloworld()
6
{
7
    std::cout << "Hello World!" << std::endl;
8
}
9
10
int _tmain(int argc, _TCHAR* argv[])
11
{
12
  boost::thread thrd(&helloworld);// &helloworld --> Pointer auf Funktion
13
    thrd.join();
14
15
  system("pause");
16
  return 0;
17
}

Nun würde ich aber gerne eine Memberfunktion (Funktion in einer Klasse) 
als Thread ausführen. Der einfachste Fall wäre hierbei, dass die 
Memberfunktion public ist und ich den Thread aus meiner main aufrufe.

Hierzu brauche ich theoretisch einen Pointer auf die Memberfunktion. Hat 
schoneinmal jemand so etwas gemacht bzw. weiß jemand wie so etwas zu 
realisieren ist?

von Peter II (Gast)


Lesenswert?

A. R. schrieb:
> Hierzu brauche ich theoretisch einen Pointer auf die Memberfunktion.

nein das geht nicht (ausser wenn die memberfunktion static ist). Du 
braucht einen Zeiger auf die Klasse wo die Memberfunktion drin ist.

Ich kenne jetzt boost nicht, aber normalerweise kann man jeden Thread 
einen void* parameter mitgeben dort musst du dann dein Zeiger auf die 
Klasse reinstecken und in der Threadfunktion (bei dir helloworld ) rufst 
du dann die Memerfunktion auf.

Man könnte es auch mit einer globalen variabel machen, aber das ist 
unschön.

von Mark .. (mork)


Lesenswert?

Wenn Deine Klasse den ()-Operator überschrieben hat, dann kannst du im 
Thread-Konstruktor auch ein Objekt dieser Klasse anstatt einer Funktion 
angeben. Dann wird eben die Methode, die () überlädt, als Einstiegspunkt 
genommen.

MfG Mark

von A. R. (redegle)


Lesenswert?

Danke,

hat perfekt geklappt.
Wenn man zu viel Programmiert weicht man sich den Kopf auf.

Habe jetzt einfach eine Funktion erstellt welcher ich einen Pointer auf 
die Klasse übergebe.
1
//Funktion
2
void Verbindung_starten(Verbindung * Pointer); //Prototyp
3
4
void Verbindung_starten(Verbindung * Pointer)
5
{
6
  Pointer->start();
7
}
8
//Verbindung ist die Klasse
1
//main
2
boost::thread thrd(boost::bind(&Verbindung_starten, &Verbindung_finanzennet_Dax));
3
//&Verbindung_finanzennet_Dax ist der Pointer auf die Klasse

von Peter II (Gast)


Lesenswert?

Der Ordnung halber kannst du die funktion Verbindung_starten als static 
member in der Klasse anlegen.

von A. R. (redegle)


Lesenswert?

@Peter II,

könntest du das bitte etwas genauer erklären?

Wenn ich die Funktion "Verbindung_starten" als Memberfunktion schreibe 
dann muss die main doch wahrscheinlich so aussehen.
1
//main
2
boost::thread thrd(boost::bind(&Klasse::Verbindung_starten, &Verbindung_finanzennet_Dax));
3
//&Verbindung_finanzennet_Dax ist der Pointer auf die Klasse

Statt das ich einen Pointer auf "Verbindung_starten" übergebe übergebe 
ich nun einen Pointer auf "Klasse::Verbindung_starten".

Dann bekomme ich als Fehlermeldung:

Fehler  7  error C2298: 'return': Ungültiger Vorgang für einen Ausdruck 
mit einem Zeiger auf eine Memberfunktion 
c:\users\Benutzername\desktop\ordner\informatik\library\boost_1_47_0\boo 
st\bind\mem_fn.hpp   342  1  Testprojekt 4

Was genau soll das static bei einer Memberfunktion bewerken?
Ich kenne das nur für einzelne Variablen.

von Peter II (Gast)


Lesenswert?

A. R. schrieb:
> Was genau soll das static bei einer Memberfunktion bewerken?
> Ich kenne das nur für einzelne Variablen.

es sorgt dafür das man eine Memberfunktion ohne instanz einer Klasse 
aufrufen kann. Die Member funktion hat dann aber keinen zugriff auf die 
Membervariablen.

Woher die Fehlermeldung kommt, weiss ich auch nicht.

von Arc N. (arc)


Lesenswert?

boost::thread kennt noch einen anderen Konstruktor...
1
class ThreadClass {
2
public:
3
   void Run() { }
4
};
5
6
ThreadClass inst;
7
8
... boost::thread(&ThreadClass::Run, &inst);

> Was genau soll das static bei einer Memberfunktion bewerken?
> Ich kenne das nur für einzelne Variablen.

Eine statische Memberfunktion hat nur Zugriff auf die statischen Member 
der Klasse und kann ohne eine Instanz der Klasse aufgerufen werden.

von Martin (Gast)


Lesenswert?

Daß es eine Klassen-Memberfunktion wird, die den impliziten this-Zeiger 
nicht mehr hat. Weswegen die Interoperabilität mit C dann möglich wird.

von Martin (Gast)


Lesenswert?

A. R. schrieb:
> Was genau soll das static bei einer Memberfunktion bewerken?
> Ich kenne das nur für einzelne Variablen.

Willst du dir nicht doch mal ein Buch kaufen und die Grundlagen von C++ 
lernen? Ich meine, das ist ja nun keine abgefahrene 
Template-Metaprogrammierung oder sowas, sondern einfach Grundwissen um 
Klassen in C++.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.