Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/04/2007, à 14: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, à 18:09)

Hors ligne

#2 Le 14/04/2007, à 16: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, à 18: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, à 18:16)

Hors ligne

#4 Le 15/04/2007, à 00:13

Visu@lSt@tion

Re : [Résolu]pthread_create et les fonctions membre d'une classe

cool


[ 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