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

 C Discussion :

Plusieurs parametres d'une fonction à passer dans un thread


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Par défaut Plusieurs parametres d'une fonction à passer dans un thread
    Salut,

    Je suis un tuto sur les thread et il est dit que quand on cree un thread avec cette fonction :
    int pthread_create(pthread_t* thread, pthread_attr_t* attr, void*(*start_routine)(void*), void* arg);

    on ne peut specifier qu'un seul parametre. Hors la fonction que je voudrais inscrire dans un nouveau thread comprend 4 parametres.

    Comment dois-je m'y prendre ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Tu peux créer un objet de type structure (une structure qui contiendra les données dont a besoin ta fonction), et tu passes son adresse comme argument. D'où le type void* (on peut lui passer ce qu'on veut).

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tu crées une structure avec 4 champs ou un tableau de 4 valeurs
    tu alloues cette structure, tu initialise les champs avec tes paramètres
    tu crées ton thread an passant le pointeur de cette structure
    le thread est lancé, il reçoit le pointeur de la structure, récupère les 4 paramètres et n'oublie pas de libérer la structure

    [Edit] Damned grillé par jeroman
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre confirmé Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Par défaut
    Merci pour l'astuce!!

    Vous me conseillez d'installer pthread ou bien d'utiliser CreateThread() de l'api win32 ?

  5. #5
    Membre confirmé Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Par défaut
    Salut,

    Pouvez vous m'expliquer comment passer un pointeur dans mon thread ?
    Dans un premier temps j'essaye juste d'incrémenter un nombre dans mon thread que je passe en parametre, et que je veux renvoyer dans mon main.

    J'ai cette fonction la :
    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
    24
    25
    DWORD WINAPI MaFonction(LPVOID Valeur)
    {
          int a;
     
          a = *(int *)Valeur;
          printf("a = %d",a);
     
          return 0;
    }
     
     
    int main(int argc, char *argv[])
    {
          HANDLE handleMonThread;
          DWORD dwGenericThread;
          int nombre=3;
     
          handleMonThread = CreateThread(NULL,0,MaFonction,&nombre,0,&dwGenericThread);
          WaitForSingleObject(handleMonThread,INFINITE);
     
          printf("\nfin, nombre = %d\n",nombre);
     
      system("PAUSE");	
      return 0;
    }
    Elle n'est pas correcte mais au moins elle compile bien. Si j'essaye d'incrémenter Valeur, le compilateur me fait une erreur du type :
    ISO C++ forbids incrementing a pointer of type `void*'

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par theclem35 Voir le message
    ISO C++ forbids incrementing a pointer of type `void*'
    Déjà, si tu codes en C, pourquoi utilises-tu un compilateur C++ ?

    Code C -> Compilateur C
    Code C++ -> Compilateur C++

    Pour incrémenter, tu peux écrire :

  7. #7
    Membre confirmé Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Par défaut
    Euh ben ouais j'avoue c'est bizarre je code toujours en C et je pensais que ca compilait toujours en C (enfin je pense)...

    Les parentheses j'avais deja essayé et ca me faisai la meme erreur, j'ai refait un nouveau projet et ca fonctionne .........

    Dans le meme esprit, comment passer une structure en entree/sortie dans une fonction gérée par un thread ?

    Ce que je veux dire c'est comment écrire le prototype et récuperer ma valeur à l'intérieur de ma fonction ?? A moins que ce soit deja un pointeur ?

    Quand on écrit (*(int *)Valeur) :
    - (int *) cela veut dire que on transforme Valeur en int car precedemment c'était un (void *) de part le thread ?
    - et le *(.....)Variable signifie donc que accede à la valeur contenue dans Valeur, c'est un pointeur quoi ?

    => Dans ce cas la, si on a obligatoirement une variable de type (void *) comment appelle t-on cela (pas un pointeur ?)??

    Merci d'avoir lu mes multiples questions qui symbolisent l'état de mon cerveau à la vue des étoiles...

    Par exemple ceci ne fonctionne pas :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    typedef struct INFOSPARTIE
    {
            char NomPartie[23];
            char IPServeur[16];
            char IPClient[16];
            char Port[6];
            char Niveau[3];
            char PseudoJ1[13];
            char PseudoJ2[13];
    } InfosPartie;
     
     
     
    DWORD WINAPI MaFonction(LPVOID Valeur)
    {
          *(InfosPartie *)Valeur[0].IPClient = "TheIPClient";
          *(InfosPartie *)Valeur[0].PseudoJ2 = "pseudoJ2";
          return 0;
    }
     
     
    int main(int argc, char *argv[])
    {
          HANDLE handleMonThread;
          DWORD dwGenericThread;
          InfosPartie MaPartie[1];
     
          MaPartie[0].NomPartie = "Ma super partie!!!";
          MaPartie[0].IPServeur = "128.182.123.134";
          MaPartie[0].PseudoJ1 = "Moi";
     
            handleMonThread = CreateThread(NULL,0,MaFonction,&MaPartie,0,&dwGenericThread);
          WaitForSingleObject(handleMonThread,INFINITE);
     
          printf("\nLe pseudo de J2 est = %s\n",MaPartie[0].PseudoJ2);
     
      system("PAUSE");	
      return 0;
    }

  8. #8
    Membre confirmé Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Par défaut
    Dans ma fonction appellé par mon thread, j'ai besoin de savoir s'il y a eu une erreur (en plus des messagebox).
    Pour chaque erreur possible je met une variable à -1.

    A l'origine je faisai un return de cette variable mais cette fois ci avec le thread il me semble que c'est impossible le return ne donnera rien ??

    Suis-je donc obligé de mettre aussi ma variable de code de retour dans ma structure en parametre du thread ?

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    A l'origine je faisai un return de cette variable mais cette fois ci avec le thread il me semble que c'est impossible le return ne donnera rien ??
    Tu peux sortir du thread avec la fonction ExitThread, avec, comme argument, le code retour, puis le récupérer dans un autre thread grâce à la fonction GetExitCodeThread.

    EDIT:
    Je viens d'essayer avec un return. Cela marche aussi mais je ne sais pas si c'est garanti.

  10. #10
    Membre confirmé Avatar de theclem35
    Homme Profil pro
    Technicien Réseaux & Télécommunications
    Inscrit en
    Décembre 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien Réseaux & Télécommunications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 148
    Par défaut
    Si je comprends bien pour chaque erreur possible dans ma fonction, il faut que j'appelle autant de fois qu'il peut y avoir d'erreur :

    TerminateThread(th, -1);

    A ce moment la dans mon main, après l'appel de mon thread je regarde la valeur de retour avec :

    GetExitCodeThread(th, &code);

    Et si le code est -1 alors la je peux reboucler ce que je demandais à l'utilisateur. Dans le cas inverse, je continue l'execution normale de mon programme?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. specifier un parametre pour une fonction stockée dans une variable
    Par kohsaka dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/02/2011, 12h49
  2. passer une fonction javascript dans un bouton
    Par zthibaut dans le forum Flash
    Réponses: 3
    Dernier message: 06/11/2006, 12h37
  3. Réponses: 6
    Dernier message: 17/10/2006, 09h48
  4. Passer un contrôle en paramètre d'une fonction
    Par Kinian dans le forum Access
    Réponses: 6
    Dernier message: 15/05/2006, 11h15
  5. Réponses: 12
    Dernier message: 25/01/2006, 07h29

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