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

Threads & Processus C++ Discussion :

Passage de paramètre dans le thread.


Sujet :

Threads & Processus C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Passage de paramètre dans le thread.
    Bonjour,

    Je veux créer un thread pour exécuter la fonction suivante :

    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
    void traiterClient(int da)
    {
      char buffer[SIZE], inst[SIZE], nomFich[SIZE], nomFichier[SIZE];
    .......
      printf("Connexion socket n°%d établie\n",da);
     
      if (read(da,nomFich,SIZE) < 0)	/*On récupere le nom du fichier*/
        {					/*Avec toujours un petit test pour éviter les erreurs*/
          perror("Nom de fichier non recu : ");
          exit(-4);
       }
    			......
      close(da);	/*On ferme la socket...*/
      close(fich);	/*...et le fichier*/
    }
    Pour créer le thread je dois utiliser la fonction suivante de la bibliothèque p_thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int pthread_create (pthread_t * thread, pthread_attr_t * attr, void * (* start_routine) (void *), void * arg)
    Comme c'est indiqué, l'argument de la fonction qu'on doit éxecuter doit être de type void* , or l'argument de ma fonction est de type int.

    j'ai donc fait un petit changement dans le code de la fontion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void traiterClient(void *da1)
    {
      char buffer[SIZE], inst[SIZE], nomFich[SIZE], nomFichier[SIZE];
     
    char nomcom[5];
     int da = (int) da1;
     
    ....}
    Dans le main, j'ai fait l'appel au thread de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc, char* argv[]){
    int da;
    pthread_t th;
    ...
    da = accept(ds, (struct sockaddr *) &name, &ta);	
    pthread_create (&th, NULL, traiterClient, (void*)da);
    ...
    }
    lors de la compilation, j'ai l'erreur suivante :

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    serveur.c:76: error: invalid conversion from ‘void (*)(int)’ to ‘void* (*)(void*)’
    serveur.c:76: error:   initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
    la ligne 76 est la ligne correspnd à l'appel à la fonction traiter client : pthread_create (&th, NULL, traiterClient, (void*)da).

    J'ai effectué plusieurs conversion de type mais j'ai pas réussi à rendre les types compatibles sachant que la fonction appelé par le thread doit avoir un argument de type void* .

    ESt ce que quelcun peut m'aider pour rendre les types compatibles et pouvoir executer la fonction traoter client par avec un thread??

    Merci d'avance.

  2. #2
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    ta fonction de thread doit retourner un void *, bien relire le message d'erreur concernant le paramètre 3 :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    serveur.c:76: error: invalid conversion from ‘void (*)(int)’ to ‘void* (*)(void*)’
    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
    void * traiterClient(int da)
    {
      char buffer[SIZE], inst[SIZE], nomFich[SIZE], nomFichier[SIZE];
    .......
      printf("Connexion socket n°%d établie\n",da);
     
      if (read(da,nomFich,SIZE) < 0)	/*On récupere le nom du fichier*/
        {					/*Avec toujours un petit test pour éviter les erreurs*/
          perror("Nom de fichier non recu : ");
          exit(-4);
       }
    			......
      close(da);	/*On ferme la socket...*/
      close(fich);	/*...et le fichier*/
       return NULL;
    }
    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
    .

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Même erreur

  4. #4
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    et là ?
    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
    void * traiterClient(void *da1)
    {
    int da = (int)da1;
      char buffer[SIZE], inst[SIZE], nomFich[SIZE], nomFichier[SIZE];
    .......
      printf("Connexion socket n°%d établie\n",da);
      
      if (read(da,nomFich,SIZE) < 0)	/*On récupere le nom du fichier*/
        {					/*Avec toujours un petit test pour éviter les erreurs*/
          perror("Nom de fichier non recu : ");
          exit(-4);
       }
    			......
      close(da);	/*On ferme la socket...*/
      close(fich);	/*...et le fichier*/
       return NULL;
    }
    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
    .

Discussions similaires

  1. Passage de plusieurs paramètres dans un thread.
    Par deck_bsd dans le forum Windows
    Réponses: 17
    Dernier message: 09/10/2010, 09h38
  2. Passage de paramètres dans un thread
    Par innosang dans le forum POSIX
    Réponses: 1
    Dernier message: 04/01/2007, 15h13
  3. Passage de paramètres dans champ hidden
    Par benassis dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/05/2005, 01h22
  4. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  5. Passage de paramètres dans une requête imbriquée
    Par DrakkoFR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 12h46

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