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

Langage Perl Discussion :

[POO] Passage d'une instance de classe à un thread


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut [POO] Passage d'une instance de classe à un thread
    Bonjour,
    J'ai une classe dont le constructeur est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub new
    {
    	my ($self) = @_; 
    	my $classe = ref($self) || $self;;
    	my $this = {};
    	bless ($this,$classe);
    	return $this; 
    }
    Cette classe contient une méthode Start dont l'unique but est d'appeler une autre de ses méthodes (ici read_client) dans un nouveaux thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub start {
    	my ($this,$clientSocket) = @_;	
    	$this->{clientThread} = threads->create "read_client",$this,$clientSocket);
    }
    Mon problème est que la méthode read_client modifie des attributs de l'instance, et que les modifications ne sont pas "remontée" au programme appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $test = TestClass->new();
    test->start($socket)
    ... 
    #fin du thread
    print $test->{UnAttributModifiéDansLeThread};
    #valeure affichée: Pas de modification
    J'imagine que le problème est du à un mauvais passage de la référence sur l'instante au niveau du thread->create. J'ai bien essayé de passer en paramètre \$this et de récupérer la valeur par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my ($refThis,$clientSocket)=@_;
    my $this = $$refThis;
    Mais le résultat est le même...

    Pourriez vous me débloquer?

    Merci de votre aide!!!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    Je suis tombé sur une page (http://perl.enstimac.fr/DocFr/perlth...%20partag%E9es) où il est écrit
    La plus grande différence entre les ithreads de Perl et les vieux threads 5.005, ou d'ailleurs n'importe quel autre système de threads, est que par défaut, aucune donnée n'est partagée. Quand un nouveau thread Perl est créé, toutes les données associées au thread courant sont copiées vers le nouveau thread, et sont dorénavant données privées du nouveau thread ! C'est similaire dans l'esprit à ce qui arrive quand un processus UNIX fait un fork(), sauf que dans notre cas les données sont copiées vers une partie différente de la mémoire à l'intérieur du même processus, sans qu'un vrai fork() ait lieu.
    Il est précisé que pour partager des données entre les différents threads, il faut utiliser le module threads::shared.

    J'ai donc essayé de modifier le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub new
    {
    	my ($self) = @_; #la fonction reçoit comme premier paramètre le nom de la classe
    	my $classe = ref($self) || $self;;
    	my $this : shared = {};
    	bless ($this,$classe);
    	return $this; 
    }
    Résultat à l'éxécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invalid value for shared scalar at...
    à la ligne "my $this : shared = {};". J'ai alors essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub start {
    	my ($this,$clientSocket) = @_;
    	share($this)
    	$this->{clientThread} = threads->create "read_client",$this,$clientSocket);
    }
    Résultat même exception mais sur le threads->create.

    Comment partager $this entre les différents threads???

    Merci de votre aide!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 43
    Points : 39
    Points
    39
    Par défaut
    salut !

    je suis pas une pro, mais je crois que ton problème est dans la déclaration de la variable, si tu veux qu'elle soit globale tu dois écrire my $this en dehors d'une subroutine...
    là tu recrée un $this dans les 2 fonctions...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 196
    Points : 94
    Points
    94
    Par défaut
    Merci chong,
    Je ne pense pas que le problème vienne de là:
    J'ai modifié le constructeur comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub new
    {
    	my ($self) = @_; #la fonction reçoit comme premier paramètre le nom de la classe
    	my $classe = ref($self) || $self;;
    	my $this :shared = &share({});  
    	bless ($this,$classe);
    	return $this; 
    }
    et la méthode start:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub start {
    	my ($this,$clientListeningSocket) = @_;		
    	my $thread = threads->create ("read_client",$this,$clientListeningSocket);
    	#$this->{clientListeningThread} = $thread;
    }
    Dans ce cas tous fonctionne bien . Par contre, je n'arrive pas à récupérer le thread dans un attribut (la ligne "$this->{clientListeningThread} = $thread;" lève une exception à l'execution...)
    Je ne comprend pas d'où cela vient...

    Merci beaucoup

Discussions similaires

  1. [POO] Récupérer une instance de classe
    Par oranocha dans le forum Langage
    Réponses: 9
    Dernier message: 01/09/2008, 08h39
  2. Réponses: 4
    Dernier message: 27/07/2007, 20h34
  3. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52
  4. [POO] Prob avec une méthode de classe
    Par Ludo75 dans le forum Langage
    Réponses: 9
    Dernier message: 06/02/2006, 22h37
  5. Exporter une instance de classe au format XML ou XMI
    Par Scorpion Rouge dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/12/2005, 11h19

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