IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

[GCC pthread_create avec en argument une fonction de callback parametr�]


Sujet :

POSIX C

  1. #1
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut [GCC pthread_create avec en argument une fonction de callback parametr�]
    Bonsoir � tous,

    Je souhaiterai cr�er un thread qui recoit en param�tre d'entr�e une fonction de callBack qui elle aussi poss�de un param�tre.

    Voici mon code :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    int startProg(int num, PVOID fcCallBack(PVOID stat)
    {
       int status = 0;
     
       status = pthread_create( &threadOne, NULL, threadPrincipale, PVOID fcCallBack);
    Mon probl�me je pense, c'est que je lui passe deja comme argument le pointeur sur la fonction de callback, mais comment lui ajouter son propre argument (PVOID stat) ?


    voila la fonction threadPrincipale

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PVOID threadPrincipale( PVOID fcCallBack(PVOID number))
    {
         int * r = number;
     
         printf("le numéro maitre vaut %d\n", *r);
     
         return null;
    }
    J'ai un message � ce moment la me disant :
    "Erreur "number" non d�clar� (premi�re utilisation dans cette fonction)"

    et voici mon programme principale avec le callback mentionn�:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
     
    PVOID callBackNumber(PVOID num)
    {
         int * n = num;
     
         // .....
     
        return NULL;
    }
     
     
    int main(void)
    {
        int status = 0;
     
        status = startProg(0, (PVOID) CallBackNumber);
     
        // .....................;
     
        return 0;
    }
    Je sais que ca fait pas mal d'imbrications, mais elles sont n�c�ssaires dans le cadre de mon projet.

    Si quelqu'un pouvais me confirmer que c'est possible, je pourrais me d�brouiller de mon cot�, sinon comment proc�der pour contourner mon probl�me ?

    J'espere avoir �t� assez claire.

    En tout cas Merci d'avance pour votre aide.

  2. #2
    Membre �prouv� Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par d�faut
    Salut,
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PVOID threadPrincipale( PVOID fcCallBack(PVOID number))
    {
         int * r = number;
     
         printf("le numéro maitre vaut %d\n", *r);
     
         return null;
    }
    Il est normal que number ne soit pas d�finie, le parametre
    de ta fonction, c'est la fonction fcCallBack.
    D'ailleur le passage d'une fonction en parametre ne se r�alise pas comme �a.
    Je ne sais plus comme �a cela demande une petite
    recherche.
    bye

  3. #3
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Citation Envoy� par krieg Voir le message
    Salut,
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PVOID threadPrincipale( PVOID fcCallBack(PVOID number))
    {
         int * r = number;
     
         printf("le numéro maitre vaut %d\n", *r);
     
         return null;
    }
    Il est normal que number ne soit pas d�finie, le parametre
    de ta fonction, c'est la fonction fcCallBack.
    D'ailleur le passage d'une fonction en parametre ne se r�alise pas comme �a.
    Je ne sais plus comme �a cela demande une petite
    recherche.
    bye
    ah bon pourtant je vois pas d'autre moyen de la d�clarer , ca fait deja un moment que je cherche et pas l'ombre d'un exemple

    sauf peu etre des parenthese , je vois vraiment pas ......

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     PVOID threadPrincipale( PVOID (fcCallBack(PVOID number)))
    en tout cas merci Krieg pour ta r�ponse, je continurerai � chercher demain

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Explique un peu plus ce que tu veux faire, s'il te plait.
    On a pas mal de noms de fonctions, mais on ne sait pas qui est suppos� appeler quoi...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Typiquement, on fait ainsi:
    Code C : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    struct ma_struct_thread
    {
    	intptr_t (*ptrFonction)(int, double);
    	intptr_t ret;
    	int param1;
    	double param2;
    };
     
    PVOID MaFonctionThread(PVOID param)
    {
    	struct ma_struct_thread * pStruct = param;
     
    	pStruct->ret = pStruct->ptrFonction(pStruct->param1, pStruct->param2);
     
    	return NULL;
    }
     
    intptr_t MaCallback(int param1, double param2);
     
    int main(void)
    {
    	pthread_t thread;
    	struct ma_struct_thread stThread = { MaCallback, 0, 10, 42.0 };
    	int res = pthread_create(&thread, NULL, MaFonctionThread, &stThread);
    	if(res == 0)
    	{
    		puts("Lancement du thread OK.");
    		puts("Attente...");
    		pthread_join(thread, NULL);
    		puts("Fin.");
    		printf("Valeur de retour: %llx\n", (unsigned long long)stThread.ret);
    	}
    	else
    	{
    		printf("Error : %d\n", res);
    	}
    	return 0;
    }

    Bien s�r, ce code implique que la structure ait une dur�e de vie sup�rieure � celle du thread. On peut faire autrement avec l'allocation dynamique...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    Typiquement, on fait ainsi:
    Code C : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    struct ma_struct_thread
    {
    	intptr_t (*ptrFonction)(int, double);
    	intptr_t ret;
    	int param1;
    	double param2;
    };
     
    PVOID MaFonctionThread(PVOID param)
    {
    	struct ma_struct_thread * pStruct = param;
     
    	pStruct->ret = pStruct->ptrFonction(pStruct->param1, pStruct->param2);
     
    	return NULL;
    }
     
    intptr_t MaCallback(int param1, double param2);
     
    int main(void)
    {
    	pthread_t thread;
    	struct ma_struct_thread stThread = { MaCallback, 0, 10, 42.0 };
    	int res = pthread_create(&thread, NULL, MaFonctionThread, &stThread);
    	if(res == 0)
    	{
    		puts("Lancement du thread OK.");
    		puts("Attente...");
    		pthread_join(thread, NULL);
    		puts("Fin.");
    		printf("Valeur de retour: %llx\n", (unsigned long long)stThread.ret);
    	}
    	else
    	{
    		printf("Error : %d\n", res);
    	}
    	return 0;
    }

    Bien s�r, ce code implique que la structure ait une dur�e de vie sup�rieure � celle du thread. On peut faire autrement avec l'allocation dynamique...
    Merci M�dinoc, c'est bien ce que j'ai fais, en faites on m'a sugger� de faire passer une structure contenant ma fonction de callBack ainsi que ces param�tres.

    Mais justement ta derni�re phrase m'intrigue :
    ce code implique que la structure ait une dur�e de vie sup�rieure � celle du thread

    Pourrais-tu etre un peu plus explicite, je vois pas tr�s bien ce que tu veux dire.

    En tout cas merci beaucoup pour ta r�ponse.
    En plus donn�e avec un bon ptit exemple clair et net qui pourrais peu etre avoir sa place dans la FAQ pour les personnes qui rencontreront le meme probl�me.

  7. #7
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Citation Envoy� par moulefrite Voir le message
    Mais justement ta derni�re phrase m'intrigue :
    ce code implique que la structure ait une dur�e de vie sup�rieure � celle du thread

    Pourrais-tu etre un peu plus explicite, je vois pas tr�s bien ce que tu veux dire.
    En clair: La structure est d�truite apr�s le pthread_join(), pas avant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Merci pour tes pr�cisions,
    Dans mon cas, j'utilise une structure declar� en local contenant mon pointeur de fonction, et une structure globale, contenant son r�sultat.

    Ce qui me choque, c'est qu'au bout d'un certain nombre d'execution, j'ai une "erreur de segmentation", je pensait que c'etait li� � ce que tu viens de me dire, mais en faites non.

    La seule diff�rence avec ton code, ce situe sur le pthread_join, moi je passe par un pthread_cancel, puis pthread_kill.

  9. #9
    Membre �prouv� Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par d�faut
    Salut,
    pour ton segmentation fault, utilse gdb tu sauras directement la ligne et la variable qui am�ne le segmentation fault.
    teste tu les valeur de retour des appels syst�mes. tu as peux etre une cr�ation
    de threads qui retourne -1.
    bye

  10. #10
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Citation Envoy� par krieg Voir le message
    Salut,
    pour ton segmentation fault, utilse gdb tu sauras directement la ligne et la variable qui am�ne le segmentation fault.
    teste tu les valeur de retour des appels syst�mes. tu as peux etre une cr�ation
    de threads qui retourne -1.
    bye
    Merci Krieg pour ton astuce, mon erreur de segmentation proviens de l'�crasement de la zone m�moire contenant l'adresse pointant sur ma fonction de callback.

    Je suis en train de chercher un moyen qui va me permettre d'allouer une zone m�moire static sur ma fonction de callback.
    Mais bon pour l'instant rien de bien concluant.

  11. #11
    Membre �prouv� Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par d�faut
    Salut,
    je ne pense pas que ce soit la bonne solution, je pense qu'il faut trouver d'o� viens ton �crasement m�moire. Tu peux tenter avec un watch sur l'adresse
    memoire avec gdb.
    il y a quelque chose de bizard dans ton code si tu passe par une autre
    m�thode tu retrouvera une erreur bizard ailleur.
    bye,

  12. #12
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Citation Envoy� par krieg Voir le message
    Salut,
    je ne pense pas que ce soit la bonne solution, je pense qu'il faut trouver d'o� viens ton �crasement m�moire. Tu peux tenter avec un watch sur l'adresse
    memoire avec gdb.
    il y a quelque chose de bizard dans ton code si tu passe par une autre
    m�thode tu retrouvera une erreur bizard ailleur.
    bye,
    Merci Krieg,
    Justement, j' en suis quasiment certain, je rencontre cette erreur apr�s avoir �x�cut� un :

    memcpy(dataOut, dataIn, sizeof(dataIn)); // sizeof(dataIn) vaut 400 bytes

    Apr�s avoir fait ce memcpy, si j'essaye d'appeler ma fonction de callback, j'ai une erreur de segmentation, alors qu'avant ce memecpy, mon callback s'execute bien.
    Je pense que c'est li� � l'�crasement de son pointeur.

    Sinon comment proc�der pour mettre en "DUR" cette adresse de callback pour pouvoir lui attribuer une zone m�moire "fixe" ?
    Sachant que ce callback a maintenant �t� ajout� � une structure qui est initialis� � l'Init du main, et qui est donn� en param�tre dans ma fonction de thread.

    Merci d'avance pour vos r�ponses

    Cordialement,

    Moulefrite

  13. #13
    Membre �prouv� Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par d�faut
    Salut,
    Citation Envoy� par moulefrite Voir le message
    memcpy(dataOut, dataIn, sizeof(dataIn)); // sizeof(dataIn) vaut 400 bytes
    As tu bien allou� un bloc de taille suffisant pour dataOut?
    Tu ne devrai pas avoir ce genre de probl�me avec memcpy.

  14. #14
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Citation Envoy� par krieg Voir le message
    Salut,

    As tu bien allou� un bloc de taille suffisant pour dataOut?
    Tu ne devrai pas avoir ce genre de probl�me avec memcpy.
    Justement, c'est bien le cas, en faites ce dataOut, est une structure qui est cr�e dans le Main() ;

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main(void)
    {
         STRUCT_RESP respT;
     
         memset(respT, 0, sizeof(STRUCT_RESP));
     
         .....
    }
    Je pense aussi � la meme chose que toi, pourtant je ne vois vraiment pas d'ou ca peu provenir.

    Merci encore Krieg pour ton aide

  15. #15
    Membre �prouv� Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Par d�faut
    Salut,
    je sais pas si ton code est cons�quent, mais si tu peux le poster enti�rement je peux essayer d'y regarder.

  16. #16
    Membre �clair�
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Chef de projet NTIC
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par d�faut
    Citation Envoy� par krieg Voir le message
    Salut,
    je sais pas si ton code est cons�quent, mais si tu peux le poster enti�rement je peux essayer d'y regarder.

    C'est bon j'ai trouv� d'ou provenais mon erreur, c'etait bien une allocation m�moire qui etait manquante, (honte � moi de pas l'avoir vue d�s le d�part )

    En tout cas, probl�me de segmentation r�solu grace � toi Krieg, et probl�me de passage d'un pointeur de fonction par le biai d'une structure r�solu.

    Merci � vous 2 M�dinoc et Krieg pour votre aides.

    Sujet R�solu

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 1
    Dernier message: 12/05/2011, 12h48
  2. [VBA-Excel]Avoir une boite de dialogue avec les arguments des fonctions ?
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    R�ponses: 4
    Dernier message: 29/05/2007, 09h37
  3. R�ponses: 3
    Dernier message: 25/07/2006, 09h25
  4. [JAVASCRIPT] passage d'argument � une fonction
    Par LE NEINDRE dans le forum G�n�ral JavaScript
    R�ponses: 6
    Dernier message: 03/06/2005, 18h17
  5. Passer une fonction comme argument � une fonction
    Par Cocotier974 dans le forum G�n�ral Python
    R�ponses: 4
    Dernier message: 29/06/2004, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo