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 :

thread, fonction et mutex ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut thread, fonction et mutex ?
    bonjour à tout le monde

    dans mon projet de créer un tchat il faut que j'applique sur le client un thread qui exécute une autre fonction qui doit lire les messages.

    Hors je doit mettre la fonction en dehors de "main" et la fonction pour lire les messages ne reconnais plus aucune variables ni même les sockets.
    Comment puis-je faire ? utiliser les mutex ? de plus je ne sais pas trop comment mettre en place cela surtout que le thread gère une boucle infinie.

    voila déjà se que j'ai fait pour le moment. (je vous ais mis seulement les parties qui posent problème car sinon c'est trop long)

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    void* message(void* data);
     
     
    int main(int argc, char *argv[])
    {
     
    /*
     
    ..............Variables et socket................
     
    */
     
    pthread_t thread;/* crée un thread */
    pthread_create(&thread, NULL, message, NULL);/* Permet d'exécuter le fonction message en parallèle */
     
    while (1)
    { /* début boucle wirthe */
     
    system("CLS");
     
    printf("\n%s : ", pseudo);
     
        fgets(chaine, sizeof chaine, stdin);
        clean(chaine);
     
     
        snprintf(buffer, sizeof(buffer), "%s : %s \n", pseudo, chaine);
     
       send(s, buffer, strlen(buffer), 0); 
     
        if  ( strcmp( chaine, "exit" ) == 0 )
        { 
     
           goto fin; /* je sais goto c'est pas bien mais c'est juste pour faire les testes en attendant :p */
     
        }  
    } /* fin boucle writhe */  
    pthread_join(thread, NULL);
     
    /*
    .........fermeture socket..............
    */
     
    return o;
    }
     
    void* message(void* data); /* Fonction de réception de message */
          {
       while(1)  /* boucle de réception des messages */
       {
     memset(buffer, '\0', sizeof(buffer));
     n = recv(s, buffer, sizeof(buffer) - 1, 0);
     printf("%s\n",buffer);
       }
          } /* Finc de la fonction de réception des messages */
    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 29
    Par défaut
    Bonjour,

    je suis nouveau dans le domaine...

    Mais il y a quelques petits points que je ne saisi pas ...

    Quand tu as déclaré ta fonction message, tu as mis en argument "void* data",
    à quoi était il sensé correspondre? Dans ta fonction message, tu n'utilises aucune variable data. Mais une chaine de caractère "buffer" et un descripteur de socket "s", (si j'ai bien compris).

    Dans ta fonction principale, tu crées ton thread de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create(&thread, NULL, message, NULL);
    Avec comme dernier argument "NULL". Celui ci ne dervait il pas correspondre à l'argument qui dervait être passé à la fonction message?

    Mes sugestions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create(&thread, NULL, message, s);
    avec "s" pour le descripteur de socket.
    et
    avec donc le descripteur de ton socket passé en argument.

    Par ailleur la fonction message que tu nous as données n'aurait elle pas un ";" en trop?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void* message(void* data); /* Fonction de réception de message */
          {
       while(1)  /* boucle de réception des messages */
       {
    Bon courage.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Par défaut
    salut alors depuis je m'oppose à un nouveau problème.

    j'ai réussie à sauver une valeur en faisant comme ceci dans les paramètres du thread:
    pthread_create(&thread, NULL, message, (void *)&s);

    mais pour plusieurs il faut faire une structure que le thread appelle (et la fonction aussi je pense)
    donc je voulais savoir comment insérer la structure dans les paramètres du thread.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    struct recep
          {
           SOCKET *s;
           char *buffer;
           char *pseudo;
           int *n;
           };
     
     
     
    /*.......................................................................*/
     
     
     
     
    pthread_t thread;/* crée un thread */
    pthread_create(&thread, NULL, message, (void *)&s);/*Permet d'exécuter le fonction message en parallèle*/
     
    while (1)
    { /* début boucle wirthe */
     
    printf("\n%s : ", pseudo);
     
        fgets(chaine, sizeof chaine, stdin);
        clean(chaine);
     
     
        snprintf(buffer, sizeof(buffer), "%s : %s \n", pseudo, chaine);
     
       send(s, buffer, strlen(buffer), 0);
     
        if  ( strcmp( chaine, "exit" ) == 0 )
        {
     
           goto fin; /* je sais goto c'est pas bien mais c'est juste pour faire les testes en attendant :p */
     
        } 
    } /* fin boucle writhe */ 
     
    pthread_join(thread, NULL);
     
     
     
     
     
    /*.................................................................*/
     
     
     
     
    void* message(void* data) /* Fonction de réception de message */
    {
     
    while(1)  /* boucle de réception des messages */
       {
    memset(buffer, '\0', sizeof(buffer));
    *n = recv(*s, buffer, sizeof(buffer) - 1, 0);
      printf("%s\n",*buffer);
       }
     
    } /* Finc de la fonction de réception des messages */
    Merci d'avoir pris attention

Discussions similaires

  1. Gestion des threads et des mutex
    Par Fiquet dans le forum Contribuez
    Réponses: 0
    Dernier message: 03/01/2011, 12h10
  2. Fonctions atomiques, mutex, ...
    Par meuns26 dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2009, 13h16
  3. thread fonction main
    Par ouiouioui dans le forum Langage
    Réponses: 3
    Dernier message: 29/01/2009, 15h00
  4. Threads fonction
    Par gg2laba dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/02/2005, 11h23
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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