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

POSIX C Discussion :

les thread en C


Sujet :

POSIX C

  1. #1
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut les thread en C
    Bonjour,
    voila, je doit faire un chat (client/serveur) en C en utilisant les files de messages et les threads.
    Je pense prendre les thread pour permettre au client de lire les message sur une fenetre et de taper les siens sur une autre en meme temps.
    Donc je pense faire ça coté client:


    ---------------------------------------------------------------------
    PREVENIR SERVEUR DE MON ARRIVEE(avec mon nom et pid)
    lancer thread fonctionT(MonNom)
    WHILE(1){
    RECEVOIR MESSAGE POUR MOI
    AFFICHER MESSAGE
    }
    ---------------------------------------------------------------------
    FONCTIONT:
    nouvelle fenetre
    WHILE(1){
    SAISIR TEXTE
    ENVOYER TEXTE AU SERVEUR
    }
    ---------------------------------------------------------------------


    Ce qui est en majuscule est dejà fait ou je sais dejà comment faire. Par contre ce qui est en minuscule je ne vois pas comment faire( la partie thread en fait et pour executer la fonction dans une nouvelle fenetre). J'ai essayer la fonction pour créer un thread en donnant la fonction à executer (fontiont) au thread mais j'arrive pas a compiler, je ne pige tres tres bien le principe des arguments de Create_thread.

    Pouvez vous m'aider?
    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 40
    Par défaut
    Salut!

    Peux-tu poster le bout de code que tu n'arrive pas a compiler et aussi les erreurs de compilations affichées?

    Comme ca on pourra mieux t'aider en voyant ou est le probleme.


    A+

  3. #3
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    alors voila;
    déclaration de le fonction:
    declaration variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           pthread_t pthread_id; 
           pthread_attr_t *attr; 
           int pidcl;
    code pour appeler la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            pidcl=getpid();
    	pthread_attr_init(attr); 
     	i=pthread_create(&pthread_id,attr,thread,(void *)pidcl);
    la fonction //pas encore faite mais de toute façon j'arrive pas encore à l'appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            void *thread(void *idcli)
            {
            }
    je pense que je ne met pas du tout comme il faut les arguments dans l'appel à pthread_create, mais j'ai essayé plein de truc et je trouve pas.

    Pour l'instant ce code reourne ça :
    In function `main':client.c.text+0x2a2): référence indéfinie vers « pthread_create »
    collect2: ld a retourné 1 code d'état d'exécution

    [Balises code/quote ajoutées par fearyourself, merci d'y penser la prochaine fois]

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Voici la signature de la fonction pthread_create:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
        void *(*start_routine)(void*), void *arg);
    Toi tu l'appelles comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread_create(&pthread_id,attr,thread,(void *)pidcl);
    Mais attr n'est pas alloué (c'est un pointeur non initialisé, et non, pthread_attr_init(attr) n'initialise pas, je suis étonné que tu n'as pas eu un segmentation fault). Il faudrait l'allouer avant d'appeler pthread_attr_init ou passer NULL.

    Enfin,
    In function `main':client.cSad.text+0x2a2): référence indéfinie vers « pthread_create »
    collect2: ld a retourné 1 code d'état d'exécution
    As-tu mis en place l'option -lpthread lors de l'édition des liens?

    Jc

  5. #5
    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
    quand tu compile est ce que tu lies bien la librairie de thread ? (option : -lpthread)

    pour ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i=pthread_create(&pthread_id,attr,thread,(void *)pidcl);
    attr correspond aux priorités tu les as bien initialisées ?

    sinon oublie pas le "&" devant le paramètre thread

    dans la fonction thread

    il faut que tu fasses ca en premier lieu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int val = *((int*)idcli)
    voila deja pour la suite je regarderai plus tard le cours commence

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par hiko-seijuro
    sinon oublie pas le "&" devant le paramètre thread
    Ce n'est pas obligatoire.

    Jc

  7. #7
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    OK merci. j'ai mis ça:

    --------code du main()---------------------------------------
    pidcl=getpid();
    printf("lance thread\n");
    i=pthread_create(&pthread_id,NULL,&thread,(void *)pidcl);
    printf("thread est lance\n");



    -----------------code fonction------------------------------

    void *thread(void *idcli)
    {
    int val = *((int*)idcli);
    printf("pid client dans le thread : %d",&val);
    }

    --------------------------------------------------------------

    Ca compile grave au -lpthread. et ça m'affiche:
    lance thread
    thread est lance

    Donc visiblement ça marche. Merci à tous.
    J'ai une dernière question. Savez vous comment faire pour que la fonction thread se lance sur un nouveau terminal pour pouvoir lui faire afficher et saisir des truc, indépendemment de ce qui se passe dans le terminal principal ou se déroule le main en parallele?
    genre pour pouvoir executer ça dans la fonction thread:


    void *thread(void *idcli)
    {
    int val = *((int*)idcli);
    printf("pid client dans le thread : %d",&val);
    }

    et que ça s'affiche sur un nouveau terminal

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par progamer54
    Donc visiblement ça marche. Merci à tous.
    De rien, mais:

    Merci de penser à et de penser à mettre les tags

    J'ai une dernière question. Savez vous comment faire pour que la fonction thread se lance sur un nouveau terminal pour pouvoir lui faire afficher et saisir des truc, indépendemment de ce qui se passe dans le terminal principal ou se déroule le main en parallele?
    C'est une question à poser sur le forum Linux (je suppose que tu fais ton programme sous linux vu que tu parles de terminaux...)

    Jc

  9. #9
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    OK merci du conseil.
    PS: oui sous Linux, fedora5 pour etre precis

  10. #10
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    ça marche peut etre pas si bien que ça finalement car :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i=pthread_create(&pthread_id,NULL,&thread,(void *)pidcl);
       	printf("thread est lance %d\n",&i);
    affiche: thread est lance -1082042084

    le nombre ne devrait pas etre 0 en cas de succès?

  11. #11
    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 pas &i qu'il faut mettre dans le printf mais i

  12. #12
    Membre éclairé Avatar de progamer54
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 242
    Par défaut
    AH LE BOULET QUE JE SUIS

    MERCI A TOI!!!

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

Discussions similaires

  1. Aide sur les Threads
    Par themoye dans le forum MFC
    Réponses: 24
    Dernier message: 06/03/2005, 15h02
  2. Les Threads... J'en remet une couche :)
    Par Higestromm dans le forum C++
    Réponses: 5
    Dernier message: 17/11/2004, 12h19
  3. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25
  4. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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