J'ai dans l'idée de multithreadé une applie en utilisant POE car l'utilisation directe des threads est impossible a cause de problème de réentrance que POE justement résoud .

J'ai donc construit un petit code de teste pour apprendre a maitriser POE, mais je me heurte a un problème que voici j'ai un thread ( Thread::Queue) qui contient une file d'attente chaque fois que POE lance un thread celui ci prend une donnée dans la file et l'affiche mais voila j'ai des problème de redondance les valeurs sont affiché plusieur fois et ce n'est pas du tout ce que je veut je veut que chaque thread traite une donnée différente.

voici mon code :

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/perl -w
use strict;
use diagnostics;
use POE qw( Component::Pool::Thread );
use Thread::Queue;
 
# Création d'une nouvelle file d'attente
my $DataQueue = Thread::Queue->new;
 
# Un ti tableau avec a bouffer pr les threads
my @k = qw/a b c d e f g h i j k l m /;
 
# On entasse des données dans la file d'attente
foreach my $i ( @k ) {
 print " $i \n";
$DataQueue->enqueue( $i );
}
 
 
 POE::Component::Pool::Thread->new
    ( MinFree       => 2,
      MaxFree       => 5,
      MaxThreads    => 15,
      StartThrneads => 5,
      Name          => "ThreadPool",
      EntryPoint    => \&thread_entry_point,
      CallBack      => \&result_handler,
      inline_states => {
          _start => sub {
                         my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                      while ( $DataQueue->pending() > 0 ) {
                           my $arguements = $DataQueue->dequeue;
                           # We are inside the component session
                           $kernel->yield(run => $arguements);
                           $kernel->post(ThreadPool => run => $arguements);
                  }
             },
         }
    );
 
# Affiche les données des threads
sub thread_entry_point {
 #   my (@arguements) = @_;
 my $arg = shift;
    print "  $arg \n";
    return 1;
 }
 
 sub result_handler {
    my ($kernel, $result) = @_[ KERNEL, ARG0 ];
    $result == 1;
    return;
 }
 
 POE::Kernel->run();
il produit le résultat suivant :

a
b
c
d
e
f
g
h
i
j
k
l
m

a

a

b

b

c

c
etc...
alors que je veut


a
b
c
d
e
f
g
h
i
j
k
l
m

a

b

c
etc...

merci de votre aide, et bon codage !!!