begin process at 2012 05 30 13:51:03
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Linux

 > 

Autre

 > 

Les threads en C sous linux !


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Les threads en C sous linux !

lundi 29 mai 2006 à 15:17:02 | Les threads en C sous linux !

ZedMaTrix

Salut a tous !

Bien voila, je cherche a faire, pour le moment, des threads à qui j'en voie un nom différent pour chacun et ils me disent le nom qu'ils ont recu..

Prenons un exemple.
Imaginons que je veuille envoyer un nom de fichier avec cette syntaxe :
fichier1, fichier2, fichiern

J'ai donc ce code :

#include <stdio.h>
#include <string.h>
#include <pthread.h>

// Tache qu'effectue les slots
void * new_thread(void * fichier)
{

        char test[50]="";
       
        strcpy(test, fichier);
       
        //Affiche le fichier
        printf("%s\n", test);
       
        //Attent 2secondes
        sleep(2);

        return(NULL);
       
}

int main ()
{

        pthread_t thread;       
       
        char fichierOr[]="fichier";
        char fichier[10]="";

        int i;
       
        for ( i=0; i<20; i++ )
        {
       
                sprintf(fichier, "%s%d", fichierOr, i);
               
                printf("Le fichier en cours : %s\n", fichier);
       
                if (pthread_create(&thread, NULL, new_thread, (void *) fichier ))
                {
                                               
                        fprintf(stderr, "error creating a new thread \n");
                        return 1;
                                               
                } else {
                       
                        printf("Slot créé.\n");
                       
                }
               
                                       
                pthread_detach(thread);
               
        }
       

        return 0;
}



Mais mon soucis, c'est que j'obtient :

Le fichier en cours : fichier0
Slot créé.
Le fichier en cours : fichier1
Slot créé.
Le fichier en cours : fichier2
Slot créé.
Le fichier en cours : fichier3
Slot créé.
Le fichier en cours : fichier4
Slot créé.
Le fichier en cours : fichier5
Slot créé.
Le fichier en cours : fichier6
Slot créé.
Le fichier en cours : fichier7
fichier7
fichier7
fichier7
fichier7
fichier7
fichier7
fichier7
Slot créé.
Le fichier en cours : fichier8
Slot créé.
Le fichier en cours : fichier9
Slot créé.
Le fichier en cours : fichier10
Slot créé.
Le fichier en cours : fichier11
Slot créé.
Le fichier en cours : fichier12
Slot créé.
Le fichier en cours : fichier13
Slot créé.
Le fichier en cours : fichier14
fichier14
fichier14
fichier14
fichier14
fichier14
fichier14
fichier14
fichier14
Slot créé.
Le fichier en cours : fichier15
Slot créé.
Le fichier en cours : fichier16
Slot créé.
Le fichier en cours : fichier17
Slot créé.
Le fichier en cours : fichier18
Slot créé.
Le fichier en cours : fichier19
Slot créé.



Pourriez vous m'aider ???
ZedMaTriX
lundi 29 mai 2006 à 16:08:17 | Re : Les threads en C sous linux !

DeAtHCrAsH

sleep(2) ==> Attend 2ms et non 2s !!!
Pour attendre 2 seconde c'est donc : sleep(2000).

Shell
lundi 29 mai 2006 à 16:22:37 | Re : Les threads en C sous linux !

AlexN

Réponse acceptée !
Problème de pointeurs :

tu utilises toujours le même pthread_t pour tes pthread_create.
Il faut utiliser un tableau

Tu utilises toujours fichier, pour passer ta chaine
Il faut utiliser un tableau

#include <stdio.h>
#include <string.h>
#include <pthread.h>

#define NTHREAD 20

// Tache qu'effectue les slots
void * new_thread(void * fichier)
{

        //Affiche le fichier
        printf("%s\n", (char *)fichier);
      
        return(NULL);
      
}

int main ()
{

        pthread_t thread[NTHREAD];      
      
        char fichierOr[]="fichier";
        char fichier[NTHREAD][10];

        int i;
      
        for ( i=0; i<NTHREAD; i++ )
        {
        //sleep(1);
      
                sprintf(fichier[i], "%s%d", fichierOr, i);
              
                printf("Le fichier en cours : %s\n", fichier[i]);
      
                if (pthread_create(&thread[i], NULL, new_thread, (void *) fichier[i] ))
                {
                                              
                        fprintf(stderr, "error creating a new thread \n");
                        return 1;
                                              
                } else {
                      
                        printf("Slot créé.\n");
                pthread_detach(thread[i]);
                      
                }
              
                                      
              
        }
        while (1);

        return 0;
}


Le while (1) sert à bloquer le thread main pour que tu ais le temps de tout voir
Parce que sinon il se termine avant la création de tes threads et tu ne les voit pas tous.
Si tu veux faire voir tout avec une pseudo synchro, tu décommentes sleep(1) et tu commentes le while(1)
lundi 29 mai 2006 à 16:24:06 | Re : Les threads en C sous linux !

ZedMaTrix

Désolé DeAtHCrAsH.. Mais je suis sous linux, c'est un sleep s'exprime en secondes ..

Dixite : [ Lien ]

Mais merci pour ton intervension !

ZedMaTriX
lundi 29 mai 2006 à 16:25:54 | Re : Les threads en C sous linux !

ZedMaTrix

Alors là AlexN pour du boulot, c'est du boulot !!

Merci pour tes explications simple et clair !

Je teste ca tout a l'heure !! Merci !

ZedMaTriX
lundi 29 mai 2006 à 16:26:07 | Re : Les threads en C sous linux !

DeAtHCrAsH

Au fait, apparement tu t'es mal documenté sur l'utilisation des thread POSIX.
Essaye plutot ca :

#include <stdio.h>
#include <string.h>
#include <pthread.h>

// Tache qu'effectue les slots
void * maRoutine(void * arg)
{
        char test[64];
        int *status = malloc (sizeof(int)); /* pour renvoyer le code de retour */
        
        strcpy(test, arg);
       
        //Affiche le fichier
        printf("%s\n", test);
       
        //Attent 2 milliseconde
        sleep(2);
         
        *status = *(int *)arg * 2; 
       
        pthread_exit (status); /*Quitte le thread en renvoyant le code retour - Utile pour savoir quel appel du thread en est le parent */     
}

int main ()
{
        pthread_t thread;       
       
        char fichierOr[]="fichier";
        char fichier[10]="";

        int i;
       
        for ( i=0; i<20; i++ )
        { 
                sprintf(fichier, "%s%d", fichierOr, i);
                printf("Le fichier en cours : %s\n", fichier);
       
                if (pthread_create(&thread, NULL, maRoutine,  &i ))
                {                       
                        fprintf(stderr, "error creating a new thread \n");
                        return -1;  // Négatif car code erreur (convention)                         
                } else {
                        printf("Slot créé.\n");    
                }
                     
                //pthread_detach(thread);        
        }      

        return 0;
}


Shell
lundi 29 mai 2006 à 16:30:22 | Re : Les threads en C sous linux !

AlexN

Mais deathcrash a aussi raison on termine un thread avec pthread_exit()
c'est plus propre
lundi 29 mai 2006 à 18:25:09 | Re : Les threads en C sous linux !

ZedMaTrix

Grand Merci à vous tous !
Et surtout à AlexN !

Vous m'avez retirez une épine du pied !!  ;)

ZedMaTriX


Cette discussion est classée dans : fichier, cours, créé, slot, fichier14


Répondre à ce message

Sujets en rapport avec ce message

config.msi [ par coockiesch ] Hello! J'ai créé un exe et créé avec visual studio un installateur. Je peux installer mon prog sans problême mais lorsque je veux le désinstaller j'ob HELP!!! Redondance de définition de fonctions!!!!!! - MFC [ par Rololo ] Salut à tous,Avec MFC, j'ai créé plusieurs boîtes de dialogue (je précise car c'est peut-être important pour la suite). Avec ce même Projet, j'ai créé Fichier en cours de copie [ par stpvb ] Salut,        Je cherche une méthode pour vérifier qu'un fichier est bien complet avant de lui faire subir un traitement... je pense en particulier à executer un fichier vbs [ par sephiro ] Voici mon probleme:mon programme a besoin de créé un fichier de type vbs, il est créé dynamiquement suivant plusieurs parametres, si je l'execute à la Obtenir un Handle sur une fichier "lock" ou en cours d'utilisation [ par SaNcOdeR ] Je cherche un moyen de récupérer un handle sur une fichier déja ouvert par le système (sous windows 2000/xp) si quelqu'un connait un moyen ? D'avance ofstream [ par kelidric ] Bonjour,Je dois créer des profils pour différents utilisateurs. Je veux donc enregistrer dans des fichiers .txt différents toutes les informations pou comment créé une base de donnée :-) [ par monimon18 ] bonjour je veut bien créer une base de donnés Access(.mbd) par code(fichier) j'ai crée une sources de donnés par SQLConfigDataSource ça marche,je veut Modifier un fichier .exe en cours d'exécution [ par JonathanHawke ] Bonjour,Je souhaîte écrire un programme qui est capable de se modier lui-même et de mettre à jour son fichier .exe correspondant. Tout se passe bien s J’ai créé un fichier contenant des chaînes de caractères [ par enoitnaillal ] Bonjour, J’ai créé un fichier contenant des chaînes de caractères, lorsque j’effectue une recherche et que la chaîne contient une lettre accentuée la Récupérer des valeurs depuis un fichier text [ par sokpassy85 ] Bonjour, Je souhaite récupérer des mesures contenues dans un fichier texte. J'ai fait ce bout de programme pour la récupération et l'affichage des val


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,413 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales