Memberfunktion als Thread ausführen / Pointer auf Memberfunktion

#2331596
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?
Gast #2331601
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.
#2331703
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
#2332140
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.
#2332154
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren