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++

  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.

  8. #8
    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
    pourrais tu m'expliquer un petit peu plus s'il te plait car je saisis pas trop le problème du void.

    Ma fonction est de type void, donc j'ai du mal a comprendre ce qui ne va pas.

    En plus, le compilo me parle de l'argument 3, qui est justement ma fonction qui est bien de type void.

    Jgalère vraiment avec cette fonction :/
    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

  9. #9
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    La fonction ne doit pas simplement être de type void (c'est à dire ne rien renvoyer), mais :
    - prendre en paramètre un pointeur (sur ce que l'on veut... pour cela on doit utiliser un pointeur sur void, soit void *)
    - renvoyer un pointeur

    Le prototype de la fonction doit donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void * data_send(void *)

  10. #10
    Membre éprouvé
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Par défaut
    Mea culpa, mon exemple n'est pas bon,
    Je suis repasse tellement vite sur les man que j'ai loupe l'etoile ....
    il fallait bien que j'ecrive au moins une anerie.

  11. #11
    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
    Je vous remericie tous, je n'ai plus d'erreur de compilations du code

    Par contre j'ai une magnifique erreur de linker :/

    [Linker error] undefined reference to `_imp__pthread_create'
    Quelqu'un sait d'ou cela vient ?

    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

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    compiles avec l'option -pthreads

  13. #13
    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'y ai pensé mais malheureusement ça ne marche pas...

    J'ai également essayé -lpthread dans l'editeur de lien mais rien.

    Je precise que je suis sous Dev-C++ et que la compilation ne pose plus de problème sous linux avec g++ (ce qui est deja une bonne chose, malheureusement c'est une appli windows que je veux developper cette fois ci :/ )
    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

  14. #14
    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 trouvé la solution, j'ai telechargé une autre version des pthreads (pthreads-win32-release-1.7.0 je crois) et j'ai compilé avec code::blocks, pour lequel les options de l'editeur de liens sont plus accessibles.
    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

+ 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