#1 Le 14/04/2007, à 13:27
- Marabout
[Résolu]pthread_create et les fonctions membre d'une classe
Bonjour,
j'aimerais passer une fonction membre d'une classe comme argument de la fonction pthread_create mais ça ne marche pas et le compilateur me retourne le message d'erreur suivant:
error: argument of type ‘void* (Test::)(void*)’ does not match ‘void* (*)(void*)’.
Le problème vient du fait que pthread_create attend un pointeur sur une fonction C et non un pointeur sur une fonction membre d'une classe. J'ai cherché une solution sur le net mais n'en ai pas trouvé.
Alors si quelqu'un à une solution à me proposer je suis preneur.
D'avance merci.
Dernière modification par Marabout (Le 14/04/2007, à 17:09)
Hors ligne
#2 Le 14/04/2007, à 15:58
- Visu@lSt@tion_
Re : [Résolu]pthread_create et les fonctions membre d'une classe
Le C++ n'est pas different du C sinon qu'il permet de faire de l'objet !
Donc tu déclares un pointeur sur ta fonction !
Exemple :
void* (*pVoid)(void *);
pVoid=(void *(*)(void *))ma_fonction;
pthread_create(pthread_t ...,NULL,pVoid,(void *)vParam);
Attention, la fonction pthread_create demande une fonction qui renvoit un pointeur (void *) et qui recoit une adresse (void *). Dans cette fonction ([1],[2],[3],[4]) :
1 C'est pour avoir le numéro l'identifiant du Thread
2 Les paramètres de shedulings ( Round Robin, Fifo, Round Robin && Fifo).
3 Pointeur de la fonction
4 Le paramètre que tu souhaites passer à la fonction !
Parcontre je te conseillerais de verifier que la fonction soit existante avec une dynamic_cast.
Ou alors de rendre cette méthode statique !
#3 Le 14/04/2007, à 17:07
- Marabout
Re : [Résolu]pthread_create et les fonctions membre d'une classe
Merci pour ton aide Visu@lSt@tion_.
La solution est, comme tu me l'as indiqué de rendre statique la méthode que l'on veut passé en argument de pthread_create. Ensuite si on veut que le thread puisse avoir accès aux données membre d'un objet de la classe il suffit de passer this comme 4éme argument de pthread_create et ça marche. Je mets un exemple de code qui marche ( si ça peut aider quelqu'un ) :
#include <iostream>
using namespace std;
class Test
{
private :
static void * thread ( void * );
public :
Test();
float flottant;
void runThread ();
};
Test::Test()
{
cout << "constructeur de la classe Test" << endl;
}
void * Test::thread ( void * arg )
{
Test * test = ( Test * ) arg;
cout << "thread running" << endl;
test->flottant = 8.3;
}
void Test::runThread ()
{
pthread_t id;
pthread_create ( &id, NULL, Test::thread, ( void * ) this );
pthread_join ( id, NULL );
}
int main()
{
Test * test = new Test();
test->runThread();
cout << test->flottant << endl;
}
Voilà et encore une fois merci Visu@lSt@tion_ d'avoir pris le temps de me répondre
Dernière modification par Marabout (Le 14/04/2007, à 17:16)
Hors ligne
#4 Le 14/04/2007, à 23:13
- Visu@lSt@tion
Re : [Résolu]pthread_create et les fonctions membre d'une classe
[ Site Web - Serveur Perso ]
[ Windows Xp Pro,Windows Serveur 2003, Gentoo 2006.1, Ubuntu 7.04 (Apache2, Php 5 & MySQL5||ORACLE) ]
[ "Un interface chaise clavier défaillant est équivalent à un ordinateur vérolé à la base !" ]
Hors ligne