C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

C++, pointeurs de fonctions, fonctions membres, threads et s
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
LECOQ Vincent
Guest





PostPosted: Fri Jul 02, 2004 9:02 am    Post subject: C++, pointeurs de fonctions, fonctions membres, threads et s Reply with quote



Je cherche a develloper une petite librairie en C++ sous Linux (et/ou
BSD ).
Elle a besoin des appels systeme signal et pthread_create.
La fonction associee a mon signal est un membre d'une des classes de
ma librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le C++
en general) m'interdisent de passer cette fonction a signal car elle
est du type MaClasse::ma_fonction et comme cette fonction doit se
servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...

Comment faire ?
Back to top
Fabien LE LEZ
Guest





PostPosted: Fri Jul 02, 2004 9:10 am    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote



Si je ne m'abuse, c'est la question habituelle, qui appelle les
réponses habituelles. Cf donc Google :
<http://www.google.com/groups?hl=en&lr=&ie=UTF-8&q=Pointeurs+de+fonctions+membres+group%3Afr.comp.lang.c%2B%2B&btnG=Search>


--
schtroumpf schtroumpf
Back to top
Serge Paccalin
Guest





PostPosted: Fri Jul 02, 2004 10:21 am    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote



Le vendredi 2 juillet 2004 à 11:02, LECOQ Vincent a écrit dans
fr.comp.lang.c++ :

Quote:
Je cherche a develloper une petite librairie en C++ sous Linux (et/ou
BSD ).
Elle a besoin des appels systeme signal et pthread_create.
La fonction associee a mon signal est un membre d'une des classes de
ma librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le C++
en general) m'interdisent de passer cette fonction a signal car elle
est du type MaClasse::ma_fonction et comme cette fonction doit se
servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...

Comment faire ?

Comme pthread_create() accepte, en plus du pointeur vers la fonction, un
pointeur vers une donnée utilisateur (généralement un void *) qui sera
passé à la fonction, il y a une solution.

Tu déclare une fonction membre statique avec le format attendu par
pthread_create(), et une autre fonction membre sans l'argument void * :

class LaClasse
{
static void *StartStatic(void *pUser);
void *Start();
}

void *LaClasse::StartStatic(void *pUser)
{
LaClasse *pThis = (LaClasse *)pUser;
return pThis->Start();
}

void *LaClasse::Start()
{
// ici, ton vrai code utile de thread
}

Ensuite, tu appelles pthread_create() avec la fonction membre statique
et un pointeur vers l'objet :

LaClasse MonObjet;
pthread_create(pThread,pAttr,LaClasse::StartStatic,&MonObjet);

La fonction membre void *LaClasse::Start() n'est pas indispensable, mais
ça évite de trimballer des "pThis->"...

Je te laisse mettre des casts plus propres.

--
___________ 2004-07-02 12:11:51
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Back to top
Serge Paccalin
Guest





PostPosted: Fri Jul 02, 2004 10:23 am    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Le vendredi 2 juillet 2004 à 11:02, LECOQ Vincent a écrit dans
fr.comp.lang.c++ :

Quote:
Je cherche a develloper une petite librairie en C++ sous Linux (et/ou
BSD ).
Elle a besoin des appels systeme signal et pthread_create.
La fonction associee a mon signal est un membre d'une des classes de
ma librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le C++
en general) m'interdisent de passer cette fonction a signal car elle
est du type MaClasse::ma_fonction et comme cette fonction doit se
servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...

Comment faire ?

Comme pthread_create() accepte, en plus du pointeur vers la fonction, un
pointeur vers une donnée utilisateur (généralement un void *) qui sera
passé à la fonction, il y a une solution.

Tu déclare une fonction membre statique avec le format attendu par
pthread_create(), et une autre fonction membre sans l'argument void * :

class LaClasse
{
static void *StartStatic(void *pUser);
void *Start();
}

void *LaClasse::StartStatic(void *pUser)
{
LaClasse *pThis = (LaClasse *)pUser;
return pThis->Start();
}

void *LaClasse::Start()
{
// ici, ton vrai code utile de thread
}

Ensuite, tu appelles pthread_create() avec la fonction membre statique
et un pointeur vers l'objet :

LaClasse MonObjet;
pthread_create(pThread,pAttr,LaClasse::StartStatic,(void *)&MonObjet);

La fonction membre void *LaClasse::Start() n'est pas indispensable, mais
ça évite de trimballer des "pThis->"...

Je te laisse mettre des casts plus propres et le contrôle d'erreur.

--
___________ 2004-07-02 12:11:51
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Back to top
Franck Branjonneau
Guest





PostPosted: Fri Jul 02, 2004 11:40 am    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> écrivait:

Quote:
Le vendredi 2 juillet 2004 à 11:02, LECOQ Vincent a écrit dans
fr.comp.lang.c++ :

Je cherche a develloper une petite librairie en C++ sous Linux (et/ou
BSD ).
Elle a besoin des appels systeme signal et pthread_create.
La fonction associee a mon signal est un membre d'une des classes de
ma librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le C++
en general) m'interdisent de passer cette fonction a signal car elle
est du type MaClasse::ma_fonction et comme cette fonction doit se
servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...

Comment faire ?

Comme pthread_create() accepte, en plus du pointeur vers la fonction, un
pointeur vers une donnée utilisateur (généralement un void *) qui sera
passé à la fonction, il y a une solution.

[ La solution erronée.]

pthread_create() veut une fonction "C" pure. Il faut en plus

extern "C" {

void *CStartStatic(void *pUser);

}

qui appelle LaClasse::StartStatic().
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>

Back to top
drkm
Guest





PostPosted: Fri Jul 02, 2004 12:42 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> writes:

Quote:
class LaClasse
{
static void *StartStatic(void *pUser);
void *Start();
}

void *LaClasse::StartStatic(void *pUser)
{
LaClasse *pThis = (LaClasse *)pUser;
return pThis->Start();
}

void *LaClasse::Start()
{
// ici, ton vrai code utile de thread
}

Même s'il s'agit de la solution souvent présentée, et qui devrait
fonctionner partout, cela n'est pas garanti par la norme, il me
semble. Un pointeur vers une fonction membre statique n'est pas de
même type qu'un pointeur vers une fonction libre. Je pense que la
solution correcte est :

class LaClasse {
void * start() {
// ...
}
} ;

extern "C" {
void * LaClasseStartCallback( void * obj ) {
LaClasse * c = static_cast< LaClasse * >( obj ) ;
return c->start() ;
}
}

--drkm

Back to top
drkm
Guest





PostPosted: Fri Jul 02, 2004 12:54 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Franck Branjonneau <fasbjx (AT) free (DOT) fr> writes:

Quote:
Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> écrivait:

Comme pthread_create() accepte, en plus du pointeur vers la fonction, un
pointeur vers une donnée utilisateur (généralement un void *) qui sera
passé à la fonction, il y a une solution.

[ La solution erronée.]

pthread_create() veut une fonction "C" pure. Il faut en plus

extern "C" {

void *CStartStatic(void *pUser);

}

qui appelle LaClasse::StartStatic().

... qui ne sert plus alors à rien. CStartStatic() peut elle-même
faire le boulot de LaClasse::StartStatic(), qui n'a plus de raison
d'être :

extern "C"
{
void * CStartStatic( void * pUser )
{
LaClasse * c = static_cast< LaClasse * >( pUser ) ;
return c->Start() ;
}
}

--drkm

Back to top
Serge Paccalin
Guest





PostPosted: Fri Jul 02, 2004 1:42 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Le vendredi 2 juillet 2004 à 13:40, Franck Branjonneau a écrit dans
fr.comp.lang.c++ :

Quote:
Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> écrivait:

Le vendredi 2 juillet 2004 à 11:02, LECOQ Vincent a écrit dans
fr.comp.lang.c++ :

Je cherche a develloper une petite librairie en C++ sous Linux (et/ou
BSD ).
Elle a besoin des appels systeme signal et pthread_create.
La fonction associee a mon signal est un membre d'une des classes de
ma librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le C++
en general) m'interdisent de passer cette fonction a signal car elle
est du type MaClasse::ma_fonction et comme cette fonction doit se
servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...

Comment faire ?

Comme pthread_create() accepte, en plus du pointeur vers la fonction, un
pointeur vers une donnée utilisateur (généralement un void *) qui sera
passé à la fonction, il y a une solution.

[ La solution erronée.]

pthread_create() veut une fonction "C" pure. Il faut en plus

extern "C" {

void *CStartStatic(void *pUser);

}

qui appelle LaClasse::StartStatic().

Dans ce cas, autant court-circuiter StartStatic() et appeler directement
pThis->Start() dans CStartStatic.

Il n'y a vraiment pas moyen de déclarer une méthode statique avec les
bons attributs (on parle de gcc, là, j'imagine ?) pour la faire accepter
par pthread_create() ?

--
___________ 2004-07-02 15:38:54
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Back to top
drkm
Guest





PostPosted: Fri Jul 02, 2004 2:08 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> writes:

Quote:
Il n'y a vraiment pas moyen de déclarer une méthode statique avec les
bons attributs (on parle de gcc, là, j'imagine ?)

Ben, heu, non. De C++.

--drkm

Back to top
Serge Paccalin
Guest





PostPosted: Fri Jul 02, 2004 3:44 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Le vendredi 2 juillet 2004 à 16:08, drkm a écrit dans fr.comp.lang.c++ :

Quote:
Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> writes:

Il n'y a vraiment pas moyen de déclarer une méthode statique avec les
bons attributs (on parle de gcc, là, j'imagine ?)

Ben, heu, non. De C++.

Ce que je voulais dire par là, c'est : « N'y aurait-il pas une solution
spécifique à un compilateur (un mot-clef non-standard) permettant
de... ? » Et comme la question d'origine parle de Linux, le compilateur
utilisé est probablement gcc (enfin, g++).

--
___________ 2004-07-02 17:43:08
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Back to top
drkm
Guest





PostPosted: Sat Jul 03, 2004 2:05 am    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> wrote


Quote:
Le vendredi 2 juillet 2004 à 16:08, drkm a écrit dans fr.comp.lang.c++ :

Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> writes:

Il n'y a vraiment pas moyen de déclarer une méthode statique avec les
bons attributs (on parle de gcc, là, j'imagine ?)

Ben, heu, non. De C++.

Ce que je voulais dire par là, c'est : « N'y aurait-il pas une solution
spécifique à un compilateur (un mot-clef non-standard) permettant
de... ? »

Mais il existe une solution standard. Maintenant, si tu es prêt à
sacrifier la portabilité afin d'avoir une fonction membre plutôt
qu'une fonction libre, ce dont je ne vois pas l'intérêt, il se peut en
effet que cela soit supporté par ton compilateur. Mais il faut alors
lui demander à lui, pas à nous.

--drkm

Back to top
Arnaud Debaene
Guest





PostPosted: Sat Jul 03, 2004 5:38 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

drkm wrote:
Quote:
Un pointeur vers une fonction membre statique n'est pas de
même type qu'un pointeur vers une fonction libre.

Ah? C'est quoi la différence (d'après la norme) ?

Arnaud



Back to top
Gabriel Dos Reis
Guest





PostPosted: Sun Jul 04, 2004 4:05 am    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

"Arnaud Debaene" <adebaene (AT) club-internet (DOT) fr> writes:

Quote:
drkm wrote:
Un pointeur vers une fonction membre statique n'est pas de
même type qu'un pointeur vers une fonction libre.

Ah? C'est quoi la différence (d'après la norme) ?

D'après la norme, la différence est ce que drkm a écrit.
:-)

-- Gaby

Back to top
James Kanze
Guest





PostPosted: Sun Jul 04, 2004 5:00 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

[email]vincent.lecoq (AT) free (DOT) fr[/email] (LECOQ Vincent) writes:

Quote:
Je cherche a develloper une petite librairie en C++ sous Linux
(et/ou BSD ).

Elle a besoin des appels systeme signal et pthread_create. La
fonction associee a mon signal est un membre d'une des classes de ma
librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le
C++ en general) m'interdisent de passer cette fonction a signal car
elle est du type MaClasse::ma_fonction et comme cette fonction doit
se servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...

Comment faire ?

Il y a en fait deux problèmes ici :

- Le premier, c'est celui dont se plaint le compilateur. Tu ne peux
pas passer l'adresse d'une fonction membre comme adresse d'une
fonction libre. Les deux ne s'appelle pas de la même façon (la
fonction membre a besoin d'un objet), et ne peuvent pas être
interchangées. Pour pthread_create, la solution est simple : tu
crées une fonction globale de linkage C qui convertit le void*
qu'il reçoit en pointeur à la classe, et puis tu appelles la
fonction voulu. Pour signal, c'est plus compliqué, étant donné que
tu n'as pas de paramètre supplémentaire, mais voir le deuxième
point.

- Le deuxième, c'est que ce que tu as droit de faire dans un handler
de signal est très, très restreint, et c'est à parier que s'il te
faut une fonction member d'une classe, c'est trop. Puisque tu parle
aussi de pthread_create, je suppose que l'application est
multi-thread. Dans ce cas-là, la bonne réponse, c'est de créer un
thread gestionnaire des signals, et traiter le signal là. Pour les
détails, voir par exemple "Programming with POSIX Threads", de David
Butenhof (et pour des questions ultérieurs, le groupe qui convient
s'appelle fr.comp.os.unix).

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Back to top
James Kanze
Guest





PostPosted: Sun Jul 04, 2004 5:03 pm    Post subject: Re: C++, pointeurs de fonctions, fonctions membres, threads Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

Quote:
Serge Paccalin <sp (AT) mailclub (DOT) no.spam.net.invalid> writes:

class LaClasse
{
static void *StartStatic(void *pUser);
void *Start();
}

void *LaClasse::StartStatic(void *pUser)
{
LaClasse *pThis = (LaClasse *)pUser;
return pThis->Start();
}

void *LaClasse::Start()
{
// ici, ton vrai code utile de thread
}

Même s'il s'agit de la solution souvent présentée, et qui devrait
fonctionner partout, cela n'est pas garanti par la norme, il me
semble.

Non seulement il n'est pas garantie, il est interdit, et un compilateur
conforme est obligé à le réfuser.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.