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 :

pthread_create ne marche pas...


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut pthread_create ne marche pas...
    Salut tout le monde !

    Dans un petit executable de test (en C sous Windows 2000), je lance un thread. (le pointeur de fonction lancé par le thread ouvre et ecrit betement une ligne dans un fichier).
    Mon executable doit etre asynchrone, en gros je lance la fonction et je me fiche de son résultat.

    ex :
    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
     
    int main()
    { 
    ....
    status = u_create_thread(uxupd_post_message,p_data);
    /* Lancement du thread échoué */
    if (status != 0)
    {
      fprintf(stdout,"Launch thread to post message failed (status = %d)\n",status);
    }
    exit (0);
    }
     
    /* ------------------------------------------- */
    /* Fonction uxupd_post_message           */
    /* ------------------------------------------- */
    /* Pointeur de fonction permettant d'etre*/
    /* lancé dans un thread                         */
    /* ------------------------------------------- */
    void *uxupd_post_message(struct UXCCMS_DATA *p_data)
    {
    	char *trace = "c:\\temp.log";
    	FILE *file;
    	LPTSTR lpt;
    	DWORD word;
    	lpt = GetCommandLine();
    	word = GetCurrentProcessId();
     
    	file = fopen(trace,"a+t");
    	if (file != (FILE *)0 )
    	{
      	   fprintf(file,"pid=%d et command=%s\n",word,lpt);
        	   fclose(file);
    	}
                    return NULL;
    }
    Le truc, c'est que le thread est bien lancé (renvoie 0), mais rien est écrit dans mon fichier.
    Par contre, quand je rajoute un Sleep(1000) après ma fonction u_create_thread, l'ecriture dans le fichier se fait bien

    Mon thread n'a pas le temps d'ecrire dans le fichier, parce que le programme principale se termine trop tot ?
    Normalement, le thread est lancé dans un process a part non ? alors il est indépendant du programme principale normalement. Je peux en sortir quand je veux....
    mhhhh...
    Quelqu'un peut me dire ce qui ne vas pas ou me dire comment contourner ce pb.

    Dois-je faire de mon thread un autre exe et faire un execvp (sans wait) de cet exe ?

    Merci de m'aider.

    Fifouille

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Salut
    Normalement, le thread est lancé dans un process a part non ? alors il est indépendant du programme principale normalement. Je peux en sortir quand je veux....
    Non un thread reste attaché au processus qui l'a lancé
    faire un wait est une solution propre pour résoudre ton problème
    Comment est ton programme actuellement ?

    mabu

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    En effet, le thread est rattaché au processus, et a la fin de celui-ci c'est normal que tous les threads soit fermé/arrêté.
    Oui, je peux faire un wait(), mais le but, c'est justement de ne pas attendre la fin de mon thread pour continuer.

    Je fais de ma fonction appelé par mon thread un exe a part. Puis dans le main je fais un execvp dans un fork de cet exe. Cela me permettra de sortir du main sans pour autant arrêter mon exe vu que je l'ai lancé dans un process a part.


  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    je fais un execvp dans un fork de cet exe
    euh... si tu le dis (moi pas connaitre ca, je suis moins calé en c que toi il me semble )
    mais lorsque je parlais de faire un wait, je ne voulait pas stopper le programmer mais empecher sa fermeture :
    au lieu de
    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    myexit(0);
     
    ...
     
    void myexit(int i)
    {
    wait(/*le thread qu'il faut attendre, dont la valeur est stoquée dans un variable globale*/);
    exit(i);
    }

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    ouais, mais justement, je veux pas bloquer (attendre) la fin de mon thread.
    je veux fonctionner en mode asynchrone.
    Mais je suis d'acco dac avec toi que c bcp plus propre d'attendre la fin de mes threads.

    thanks.

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

Discussions similaires

  1. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 09h28
  2. Maximiser fenêtre ne marche pas
    Par sandrinec dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/06/2003, 12h02
  3. Réponses: 9
    Dernier message: 07/05/2003, 12h57
  4. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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