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 :

[PThtrads]Compilation ok mais aucune action :(


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de SOAD08
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 101
    Par défaut [PThtrads]Compilation ok mais aucune action :(
    Bonjour,

    j'ai besoin d'utiliser les threads dans le cadre d'un systeme de chat, seulement, j'ai (vraiment) des problemes avec ceux ci.

    En effet, je me suis cassé les dents sur Boost::thread pour ensuite m'orienter vers les pthread.

    Voila mon problème : j'ai créé un petit programme bidon (deux boucles qui affichent du texte) simplement pour essayer les thread, seulement impossible d'avoir un affichage venant du thread créé, pourtant aucune erreur de compilation.

    Voici mon code :

    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
     
    #include <iostream>
    #include <pthread.h>    
     
    using namespace std;
     
    int a = 0, b = 0;
    void data_send(void *)
    {
         while (a<5)
         {
               cout << "1234" << endl;
               a++;
         }
    }
     
    void data_recv()
    { 
         while (b<5)
         {
               cout << "abcd" << endl;
               b++;
         }
    }
     
    int main(int argc, char *argv[])
    {
        int pthread_create(pthread_t *tid, pthread_attr_t *attributs, void *(*data_send)(void *), void *arg);
        data_recv();
        system("PAUSE");
        return 0;
    }
    et voici l'affichage que j'obtient :

    abcd
    abcd
    abcd
    abcd
    Pourquoi ne m'affiche-t-il pas également 1234 ?

    Merci d'avance
    www.cppreference.com ==> A lire pour vos problèmes touchant à la STL
    www.php.net ==> A lire avant de demander le fonctionnement d'une fonction PHP

    Alliance developpez Muzgo

  2. #2
    Membre éprouvé
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Par défaut
    Citation Envoyé par SOAD08
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        int pthread_create(pthread_t *tid, pthread_attr_t *attributs, void *(*data_send)(void *), void *arg);
    1 - Heu ca fait des lustres que je n'ai pas ecrit une ligne de C++, mais avec le code ci-dessus dans le corps de ta fonction, tu n'aurais pas par hasard simplement declare une fonction qui s'appelle pthread_create? Je pense que c'est a revoir vu que tu voulais utiliser celle de la librairie ....
    2 - Pour gerer la terminaison de tes threads, il te faudra faire appel a pthread_join si mes vieux souvenirs sont bons.

    A+

    Edit :
    1 - j'oubliais, le 1 explique pourquoi tu n'as que des "abcd" ... il n'y a aucun thread cree.
    2 - Les deux threads utilisant la meme ressource (stdout), je me mefierai du resultat en sortie personnellement ...

  3. #3
    Membre éprouvé
    Avatar de SOAD08
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 101
    Par défaut
    J'ai essayé avec d'autres action que l'affichage pour le thread (écriture dans un fichier) docn je suis sur qu'il ne se lance pas.

    J'ai éssayé sans le int devant thread create mais ça ne marche pas je vais regarder avec thread join.
    www.cppreference.com ==> A lire pour vos problèmes touchant à la STL
    www.php.net ==> A lire avant de demander le fonctionnement d'une fonction PHP

    Alliance developpez Muzgo

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    c'est juste une déclaration de fonction que tu as fait. Il faudrait que tu fasses ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pthread_t th1;
    int num1;
    if (pthread_create(&th1, NULL, data_send, &num1) <0)
            	erreur("Erreur pthread_create");
    voici ici pour son utilisation

  5. #5
    Membre éprouvé
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Par défaut
    J'ai du mal me faire comprendre. :-?
    Le probleme n'est pas lie a tes appels a "cout",
    mais a ton appel a pthread_create qui n'en est pas un.

    Un exemple vaut mieux qu'un long discours (meme si mon C est tres loin d'etre parfait).
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>    
     
    int a = 0, b = 0;
    int res;
     
    pthread_t tid;
     
    void * data_send(void * dummy)
    {
      while (a<5)
      {
        printf("fils : 1234\n");
        a++;
      }
      return NULL;
    }
     
    void data_recv()
    { 
      while (b<5)
      {
        printf("pere : abcd\n");
        b++;
      }
    }
     
    int main()
    {
        res = pthread_create(&tid, NULL, &data_send, NULL);
        if (res != 0) 
        {
           exit(res);
        }
        data_recv();
        res = pthread_join(tid,NULL);
        if (res != 0) 
        {
           exit(res);
        }
        printf("On est sur que le thread est termine\n");
        return 0;
    }
    Je m'excuse d'avance envers les vrais codeurs C dont je ne fais pas parti ... Mais bon un exemple en Ada n'aurait pas beaucoup aide ici.
    /me prie pour ne pas avoir ecrit trop d'aneries ...

    Maintenant, cela ne change rien au probleme lie a l'utilisation du flux standard par les deux threads, donc gaffe.

    Edit : boulette dans data_send...

  6. #6
    Membre éprouvé
    Avatar de SOAD08
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 101
    Par défaut
    Bon d'abord, désolé de ne pas avoir répondu ces derniers temps, mais j'ai rarement accès au net ces temps ci :/

    Bon j'ai essayé en modifiant mon phtread_create, parceque en y réflechissant, c'est vrai qu'il n'avait aucun sens...

    Voici mon nouveau code :

    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
     
    #include <iostream>
    #include <pthread.h>
     
     
    using namespace std;
    int a = 0, b = 0;
    void data_send()
    {
         while (a<5)
         {
               cout << "1234" << endl;
               a++;
         }
    }
     
    int data_recv()
    { 
         while (b<5)
         {
               cout << "abcd" << endl;
               b++;
         }
    }
     
    int main(int argc, char *argv[])
    {
        pthread_t th1;
        int num1;
        if (pthread_create(&th1, NULL, data_send, &num1) <0)
            	cerr << "Erreur pthread_create" << endl;
        data_recv();
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Mais cette fois ci j'obtient une erreur de compilation :

    serveur.cc: In function ‘int main(int, char**)’:
    serveur.cc:29: error: invalid conversion from ‘void (*)()’ to ‘void* (*)(void*)’serveur.cc:29: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
    Apparement (je suis débutant en C++, mon domaine serait plutot le PHP), ce serais une incompatibilité de types entre le prototype de pthread_create et mon appel et cette fonction non ?

    Si quelqu'un à la solution...

    Merci d'avance.
    www.cppreference.com ==> A lire pour vos problèmes touchant à la STL
    www.php.net ==> A lire avant de demander le fonctionnement d'une fonction PHP

    Alliance developpez Muzgo

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    La procédure de thread doit prendre un void* en paramètre.
    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.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/02/2015, 13h54
  2. Erreur compilation vb2008 mais aucune erreur
    Par rock_4_ever dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/08/2010, 15h33
  3. Réponses: 9
    Dernier message: 05/11/2006, 13h16
  4. [MySQL] Requete SQL correcte Mais aucun affichage
    Par jenga dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 10/04/2006, 13h55
  5. Réponses: 4
    Dernier message: 08/01/2006, 18h26

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