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 :

thread (probleme avec une tour lego USB)


Sujet :

POSIX C

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut thread (probleme avec une tour lego USB)
    Bonjour ici!

    J'ai un probleme en c et avec des lego! ( oui, bah, fallait s'en douter, je comptais pas creer un post racontant mon week end a Chicago)

    Donc, pour mettre dans le contexte, je fais mumuse avec des lego mindstorm (des lego programmables), mon pc tourne sous winXP, j'utilise BrickOS (ca permet de de programmer les lego en C). BrickOS tourne sous cygwin.

    jusque là, tout est bon

    pour faire tourner un programme qui utilise la tour USB pour faire de la communication PC->lego, j'utilise LNPHost qui est une librairie faite pour ca... mais j'ai un ti probleme avec...

    Voila, j'ai fini la mise en situation...

    La fonction qui permet d'envoyer des messages par la tour USB fonctionne... mais pas tout le temps: par fois, la fonction bloque et je dois arreter et relancer le programme, et... ca m'embete beaucoup...

    J'ai pensé à trois solutions
    1) je regarde la fonction et je la corrige... j'ai regardé, mais j'suis incapable de la corriger alors on va faire avec...

    2) Je sauvegarde dans un fichier a coté l'etat de mon programme, quand ca bloque... j'arrete et relance mon programme et il reprends comme c'est indiqué dans le fichier... mais bon, je sais pas le faire et j'aimerai que le programme ai pas besoin de moi (c'est con de vouloir faire des robots autonomes si je dois intervenir de temps en temps...)

    3) j'utilise un thread (bon je sais pas faire non plus, d'ou mon post ici ) Mon idée, c'est de: lancer le thread avant que j'appel la fonction de communication et je le tue une fois que cette fonction est finie. c'est à dire en gros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    je lance mon thread
    je lance ma fonction communication
    j'arrete mon thread
    avec mon thread qui doit chronometrer son temps d'exécution, si le temps est trop long, le thread arrete la fonction de communication et la relance...

    Donc voila mon idée... pour faire ca, je pensais mettre un goto dans mon thread, un peu dans ce style là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void thread(void)
    attendre deux secondes
    goto ...
    fin de la fonction thread
    avec le goto qui pointe vers une etiquette sur mon main au niveau de ma ligne "je lance mon thread"

    mais là, d'abord, je sais pas trop comment arreter ma fonction communication qui est bloquée, et je ne sais pas si le goto empeche mon thread de se finir (par ce que moi, j'aimerai que mon thread se finisse...) ?

    Bon, je sais pas trop comment rédiger ca en C, mais avant, j'aimerai savoir si quelqu'un a pas d'autres idées pour une solution un peu moins "bricolage" ou bien si il existe des choses toutes faites ou bien si... je sais pas, moi, si vous avez quelque chose à en dire


    Haha, je suis pas sur d'avoir été clair en expliquant ma solution bricolage... si vous avez rien compris, levez la main, je ré expliquerai.
    Merci
    JuuL

  2. #2
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Slt,

    Bon je n'ai pas tout compris mais on va essaye de faire avec. Aparemment selon ce que tu dis tu as acces a la fonction de communication avec ta tour usb. Ce que tu peux faire c'est justement faire de cette fonction un processus. Ce qui fait qu tu pourras executer un thread pricipal qui aura pour tache de lancer ton thread de communication. L'avantage est que quand ton thread pricipale lance un thread, il recuper son PID (c'est un numero qui permet d'identifier ton processus). Avec ce PID tu pourras arreter ton processus de communication sans probleme.

    Le hic (que j'ai homis de te dire au debut) est que cette solution est valable pour une machine qui tourne sur linux. Je pense (j'en suis meme sure) qu'il est aussi possible de faire de meme avec windows, mais je ne sais pas comment car tout mes thread ont toujours ete gere avec linux et vu que la gestion n'est pas la meme, le code non plus.

    Mais si tu veux plus de renseigenements sur certaines choses demande quand meme on ne sait jamais. Si je ne peux rien faire pour toi je te le dirai
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    oki oki
    merci

    oui, en effet, j'ai accee à la function et actuelement, je la lance comme une fonction normale... mais des fois elle marche mal et se bloque.

    a priori j'utilie pas le gestionnaire de thread de windows mais la bibliotheque pthread (et si j'ai compris ce que je lis sur les thread depuis peu, ca doit plus etre lié a linux qu'à windows... c'est dû à cygwin qui emule (en parti) un environement linux)

    Je regarde comment ca marche et si j'arrive pas a faire marcher mes threads, je reviendrai poser des questions, merci

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Coucou

    C'est cool, je vois comment ca marche, et le début et le lancement du thread ca va, par contre, j'ai pas trouvé comment savoir si mon thread est arrivé à la fin de son code ou s'il est resté bloqué... humm, un ti bout de code ca va peut-etre un peu mieux parler pour moi

    j'ai créé une fonction, qui lance mon 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
    void comm(char* val1,int val2)
    {
    pthread_t my_thread;
    char* tableau[2];
    tableau[0]=val1;
    tableau[1]= (char*) val2;
    on_recommence:
     
      pthread_create( &my_thread, NULL, (void *(*)())communication_thread, tableau);
     
      sleep(10);
     
      printf("%i\n",pthread_cancel( my_thread));
      if  (pthread_cancel( my_thread)==0)
      {
          goto on_recommence;
      }
     
    }
    et voici mon thread (la fonction lnp_addressing_send est celle qui bloque de temps en temps)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void *communication_thread(char* patate[])
    {
    lnp_addressing_send( &tower,patate[0], strlen(patate[0]), (int)patate[1], 0);  
    return(NULL); 
    }
    Dans le monde merveilleux de JuuL et d'apres l'idée que je m'etais faite: une fois que le thread arrivait sur son return(NULL) le pthread_cancel( my_thread) de ma fonction allait me retourner 3 (ou une valeur differente de 0) et que si, mon thread est pas arrivé à la fin, (bin, ca veut dire que la fonction lnp_addressing_send est bloquée) le pthread_cancel( my_thread) tue le thread, et avec le goto je le relance... mais dans la réalité vraie du monde réel, bin... pthread_cancel( my_thread) me renvoie toujours 0 ...

    (Et là ! "tsin tsin tsin tsin" je me souviens vaguement de mes cours qui parlaient d'état zombie ou je ne sais quel mort-vivant !!! bon je sais pas si ca a quelque chose a voir )

    mais du coup, ca marche pas comme je veux...(voir, on peu dire que ca marche pas) mon but etant pas de faire du travail en paralelle, mais de verifier si ma fonction lnp_addressing_send fonctionne correctement quand je m'en sert...

    j'ai pensé utiliser le pthread_join mais je vois pas comment... mais ca m'a pas l'air utile là...

    et ce que j'aimerai en fait, c'est que mon thread se petit-suicide a la fin de son code, mais il a pas l'air de vouloir...

    (j'ai un talent fous pour réussir a faire des phrases incomprehensibles avec des vraies mots dedans )

    Voila, si quelqu'un peu passer un peu de temps à essayer de comprendre ce que je raconte et à me répondre merci

  5. #5
    Membre actif Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Points : 252
    Points
    252
    Par défaut
    Je te conseil ce cours : http://emmanuel-delahaye.developpez.com/pthreads.htm qui devrais te donner la solution.

    Il est clair[...] que la tâche main() se termine avant que les autres ne soient lancées. Cela signifie que, étant donné que le contexte des tâche n'existe plus, le comportement des tâches devient indéterminé. C'est pourquoi il existe la fonction de synchronisation pthread_join() qui permet de suspendre l'exécution de la tâche courante en attendant la fin d'une tâche déterminée.

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Hum evite les goto c'est beurk.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  7. #7
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Comme dit Skyrunner les goto sont a eviter absolument. Je te conseille de trouver une autre astuce pour faire ceci (tu pourrais mettre la partie que realise le goto dans une fonction ce sera plus propre).

    En ce qui concerne ton pb, il y a un truc que tu peux essaye mais qui n'est pas tres simple, c'est la gestion des signaux avec pthread_kill : http://sources.redhat.com/pthreads-w...read_kill.html
    En fait le but c'est que quand ton application est terminee elle envoi un signal au processus principal pour lui dire que la tache est executée. Ou encore faire le processus principal envoye un signal au bout de x seconde pour que le thread qui envoi les donnees s'arrete. Comme ceci si l'envoi des donnees n'est pas fini ben dans la gestion du signal, soit tu demandes de recommencer un envoi car ca a bloque soit tu arretes le processus.

    Je ne sais pas si j'ai bien explique, car moi aussi je fais des phrases exceptionnelles avec de vrais mots !!
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  8. #8
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Pikwik
    Je te conseil ce cours : http://emmanuel-delahaye.developpez.com/pthreads.htm qui devrais te donner la solution.
    Je crois pas trouver ma solution ici, j'a'i pas mal regardé ce cours (j'ai fait mon thread a partir de celui ci) mais le truc, c'est que je veux pas attendre que mon thread se finnisse, vu que des fois, il se fini pas, justement je veux verrifier si ou bout d'un certain temps, il est fini et si c'est le cas, c'est cool, si c'est pas le cas, je veux le tuer et le relancer, mais merci d'avoir répondu

    Skyrunner: ok, je verrai ca quand j'aurai reussi a faire marcher le reste un je dois pourvoir le faire en do while ou en switch

    fumiste972: les signnaux semblent etre une bonne solution, je suis en train de regarder comment ca marche, merci j'ai eu des cours la dessus aussi... 'tain, en 2 ans, on en oublie des trucs quand on s'en sert pas...

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    pfiiiiouuuuu, j'suis trop nul!!!

    Bon finalement, apres avoir batailler pendant quelques heures avec les signaux... j'me suis dit "pu**** de bor*** de me***!!! fais ch*** ce truc!!!!!"

    et donc, finalement, j'ai compris comment marchait la fonction
    pthread_cancel (enfin, je suis pas sur sur que mon code soit tres joli et finisse pas par planter... mais j'espere que ca arrivera pas pendant ma petite utilisation...)

    d'ailleur, j'suis tellement fier de mes 4 lignes de code moisies que je vais les mettre ici

    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
    void comm(char* val1,int val2)
    {
    pthread_t my_thread;
    pthread_t my_pid;
     
    char* tableau[4];
    tableau[0]=val1;
    tableau[1]= (char*) val2; //giving the string to transmit
    tableau[2]= (char*) my_pid; // giving the receiver
    tableau[3]= (char*) 0; // used to know if the thread is over
     
    pthread_create( &my_thread, NULL, (void *(*)())communication_thread, tableau);
    sleep(4);
    if ((int)tableau[3]==0)
       {
       do
          {
           printf("bad transmition... \n");
           pthread_cancel(my_thread);
           pthread_join(my_thread, NULL);
           pthread_create( &thread1, NULL, (void *(*)())communication_thread,tableau);
           sleep(4);
           }
        while((int)tableau[3]==0);
         }
     
    }
    et pour mon thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void *communication_thread(char* patate[])
    {
         pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
         pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
         lnp_addressing_send( &tower,patate[0], strlen(patate[0]), (int)patate[1], 0);
         patate[3]=(char*)1;  
         return(NULL); 
    }

    j'ai viré le goto, j'espere qu'un do while, c'est moins beurk

    merci beaucoup a tous en tous cas

  10. #10
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Oublie pas si ton probleme est regle. Et bon courage pour la suite
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

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

Discussions similaires

  1. PROBLEME AVEC UNE TABLE INTERBASE
    Par barro dans le forum InterBase
    Réponses: 1
    Dernier message: 22/09/2004, 08h16
  2. [C#] [Oracle] Probleme avec une procedure stockée
    Par sronin1 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/05/2004, 19h04
  3. Probleme avec une table vide
    Par king dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/03/2004, 14h24
  4. au secour probleme avec une requete...
    Par soufiane59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/09/2003, 10h28
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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