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

Threads & Processus C++ Discussion :

pThread passage argument normal


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 63
    Par défaut pThread passage argument normal
    Bonjour.

    Dans mon application j'utilise des thread et je passe comme argument une structure.

    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
      // Création de la structure de base
        struct thread_data info;
        info.distFile = Downloader::distFile;
        info.file = Downloader::file;
        info.hebergeur = Downloader::hebergeur;
        info.localFile = localFile;
        info.URL = URL;
     
    	info.startLength = 0; // Emplacement de commencement
    	info.downloadLength = 0; // Taille a télécharger
     
        // Récupérer taille fichier
    	Downloader::getLengthFile();
    	info.lengthFile = Downloader::lengthFile;
     
     
    	// Crée le nombre de thread nécessaire
        pthread_t *threads;
        threads = (pthread_t*) malloc( sizeof(pthread_t) * nbThread );
     
     
    	int quant = Downloader::lengthFile / nbThread;
     
    	int x= 0;
    	for(int i = 0 ; i < nbThread ; i++)
    	{
    		info.startLength = x; // Emplacement de commencement
    		info.downloadLength = quant; // Taille a télécharger
    		x += quant;
    		pthread_create(&threads[i], NULL, DownloadeThread, (void *)&info);
    	}
    Je récupère les donnée depuis mon thread mais comme cela est un pointeur et que les donnée change a chaque lancement de thread dans la boucle, je récupère sur chaque les donnée du dernier lancement.

    Comment puis-je régler ce problème ?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    je dirais que ta structure d'info devrait contenir un std::vector<Chunk>.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Chunk{
    int startPoint;
    int quant;
    thread_data* backptr;
    }
    A chaque fois que tu crée une thread, tu push_back un objet chunk dans ton vector, et c'est l'adresse chunks[i] que tu passes à ta thread. (le back_ptr permet à la thread de remonter vers les infos globales).

    Par contre, sur ton calcul de quant attention, il me semble que tu risque de ne pas télécharger tout le fichier par erreur d'arrondi.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Attention, ajouter un élément dans un vecteur invalide les itérateurs et pointeurs existants sur les éléments déjà présent. Donc si on ne fait pas attention, créer ainsi un nouveau thread peut casser les autres en cours d'exécution.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Arf! J'avais oublié ce problème
    Donc il faudrait plutôt faire un resize une fois le nombre de thread calculé (avant la boucle) et dans la boucle mettre à jour le contenu de l'objet chunks[i] puis passer son adresse à la thread créée. Avec ça les pointeurs resteraient valides, non?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 63
    Par défaut
    Merci pour vos réponses.

    Moi qui penser qu'il n'y avait pas grand choses à faire au vu du peu de choses que j'ai besoin de faire ^^

    N'y a-t-il pas de solution plus simple a mettre en place?

    Concernant la variable quant je suis au courant, mais pas de problème car sur le dernier thread je ne spécifie pas le nombre de byte à récupérer mais juste là où il commence et donc il le télécharge entièrement.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    en quoi c'est compliqué de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1 info.chunks.resize(nbThread);
    ...
    2 info.chunks[i]->startLength=x; //(simple modification d'une ligne préexistante)
    3 info.chunks[i]->downloadLength=quant; //(simple modification d'une ligne préexistante)
    4 info.chunks[i]->back_ptr=&info;
    avec un malheureux petit objet Chunk à 3 membres et un vector dans info?

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

Discussions similaires

  1. [fonctions imbriquées] Passage argument d'une fonction a l'autre
    Par ricololo dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 06/11/2008, 13h44
  2. pb passage arguments
    Par luffy.luck dans le forum Tkinter
    Réponses: 8
    Dernier message: 10/05/2008, 15h46
  3. Passage argument Formulaire->Etat
    Par dagan dans le forum VBA Access
    Réponses: 10
    Dernier message: 12/12/2007, 13h34
  4. Access passage arguments
    Par benejepo dans le forum IHM
    Réponses: 12
    Dernier message: 10/09/2007, 09h51
  5. Probleme passage argument thread
    Par Leguerinos dans le forum POSIX
    Réponses: 3
    Dernier message: 15/02/2007, 15h29

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