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

Modules Perl Discussion :

Problème utilisation methode shared_clone (module threads::shared)


Sujet :

Modules Perl

  1. #1
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut Problème utilisation methode shared_clone (module threads::shared)
    Bonjour,

    Je rencontre quelques problèmes (et oui encore moi ) avec l'utilisation du module threads::shared et de la methode shared_clone en particulier. Et ceci malgré la lecture attentive du tutoriel de Djibril à ce sujet!

    Je m'explique:

    J'ai une fenêtre principale (TK) qui récupère des infos entrées par l'utilisateur;
    Ces infos sont stockées dans un objet disons $obj.
    Une fois ces infos saisies je lance un calcul grâce à une fonction d'un autre module disons "calcul"
    et je stocke les résultats dans un répertoire disons $dirsave.

    Lorsque l'utilisateur a fini de saisir ses données il valide par un clic et je lance alors:
    La fonction de calcul: calcul($obj,$dir_save).

    Comme j'ai bien fait (enfin j'ai cru) mes devoirs et surtout que je me suis fortement inspiré du tutoriel de Djibril,
    J'ai bien déclaré mes variables partagées et fait un clone de $obj via la méthode shared_clone, pourtant j'ai encore
    l'erreur classique:
    invalid value for shared scalar at....
    Voici mon code : (quasi copier coller du tutoriel)

    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
    37
     
    my %fonctionsALancerDansThread =('calcul'=> \&calcul);
     
    # Threads et variables partagées
    my $obj = Obj->new();              
    my $clone_obj : shared;        
    $clone_obj = shared_clone($obj);
    my $TuerThread : shared; 		# Permet de tuer le thread proprement
    my $NomFonction : shared; 		# Contient le nom de la fonction à appeler
    my $ThreadTravail : shared; 		# Contient la valeur permettant au thread de lancer une procédure
    my @ArgumentsThread : shared; 	# Contient les arguments à passer à une éventuelle procédure
    my @ResultatFonction : shared; 	# Contient le résultat des fonctions lancées dans le thread
    $ThreadTravail = 0; 			# 0 : thread ne fait rien,  1 : il bosse
    $TuerThread = 0; 				# 0 : thread en vie,  1 : thread se termine
     
    # Création du thread
    my $Thread = threads->create( \&MonThread);
     
    #-------------------------------------------------------------------------------------------------
    # Fonction MonThread:
    #-------------------------------------------------------------------------------------------------
    sub MonThread {
    	# Tourne en rond
    	while (1) {
    		# demande au thread de travailler
    		if ( $ThreadTravail == 1 ) {
    			# Lance la procédure
    			 $fonctionsALancerDansThread{$NomFonction}->@ArgumentsThread);
    			# demande au thread de dormir
    			$ThreadTravail = 0;
    		}
    	# Terminer le thread
    	last if ( $TuerThread == 1 );
    	sleep 0.5;
    	}
    	return;
    }
    L'objet est "édité" via l'interface et une fois cela fait, on lance le calcul par
    le bouton Tk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sub bouton_lance_calcul{
     
    ......
     
    $NomFonction = "calcul";                           # Procédure à appeler
    @ArgumentsThread = ($clone_obj,$dirsave) ;  # On lui donne les arguments
    $ThreadTravail = 1;				    # On lance le thread	
     
    ...
     
    }
    Merci d'avance pour vos lumières.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Bonjour issoram,

    As tu un exemple basique qui me permettrais de tester ton code ?

    Sinon, es tu vraiment obligé de passer en argument des objets, il serait plus judicieux de voir comment tu pourrais plutôt passer en argument des chaines de caractères ou des références à des tableaux ou hash. Pourquoi des objets d'ailleurs et pas des scalaires, peux t on voir ton code.

    Avec un exemple plus conséquent, on pourrait plus facilement voir comment t'aider.

    Sinon, d'après la doc de threads::shared, j'ai pas l'impression qu'on puisse partager des objets.

    as tu essayé de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $obj = Obj->new();              
    bless($obj);       
    $clone_obj = shared_clone($obj);
    Courage, et essaye de nous donner plus de codes

  3. #3
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Pourtant dans la doc, il parle du partage d'objets

    shared_clone REF
    "shared_clone" takes a reference, and returns a shared version of
    its argument, performing a deep copy on any non-shared elements.
    Any shared elements in the argument are used as is (i.e., they are
    not cloned).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $cpy = shared_clone({'foo' => [qw/foo bar baz/]});
    Object status (i.e., the class an object is blessed into) is also
    cloned.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     my $obj = {'foo' => [qw/foo bar baz/]};
                 bless($obj, 'Foo');
                 my $cpy = shared_clone($obj);
                 print(ref($cpy), "\n");         # Outputs 'Foo'
    Sinon je n'ai pas vraiment d'exemple simple et le code de mon interface est assez conséquent..

Discussions similaires

  1. problème sur l'utilisation d'un module si interface graphique
    Par ohtoulouse dans le forum Général Python
    Réponses: 0
    Dernier message: 02/06/2010, 16h09
  2. Problèmes Installation module Threads
    Par issoram dans le forum Modules
    Réponses: 19
    Dernier message: 16/05/2009, 12h02
  3. Réponses: 0
    Dernier message: 20/04/2009, 11h49
  4. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 21h55
  5. Module Threading, utilisation timer(x,y) .
    Par aladin46 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/01/2005, 19h55

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