C'est encore moi ....
je fais mon serveur et j'utilise maintenant les thread de perl. Et j'ai un problème pour tester si une variable existe ...
Voici donc mon code un peu simplifié:
#!/usr/bin/perl -w
use strict;
# use diagnostics;
use IO::Socket;
use Net::hostent; # gethostbyaddr()
use threads;
# use thread::Queue;
use threads::shared;
my $server;
my @messages : shared = ();
my $current_message : shared;
my $life : shared = 1;
$server = IO::Socket::INET->new(
Proto => $protocol,
LocalPort => $port,
Reuse => 1,
Listen => 5,
);
$server->autoflush(1);
die "Failure: $!\n" if !$server;
print "Listening $port\n";
my $thread_connexion = new threads(\&thread_connexion, $server);
#
# Ceci pour générer un message dans @messages pour être affiché dans le client
# Je n'utilise pas les queues car si plusieurs clients sont connectés, seul un seul
# peut afficher les messages
#
my $thread_alert = new threads(\&thread_alert);
while($life){
print "Press to quit this server.\n";
;
$life=0;
$thread_connexion->join;
$thread_alert->join;
}
sub thread_alert{
my $i=0;
while($life){
sleep(10);
$i++;
$current_message = scalar @messages;
$messages[scalar @messages]="time: $i\n";
}
}
sub thread_display{
my ($client) = @_;
my $i = $current_message;
while($life){
if(defined($messages[$i])){
# next if !$messages[$i];
print $client $messages[$i]."\n";
$i++;
}
}
}
#
# Lance un thread thread_display pour une connexion.
#
sub thread_connexion{
while($life){
if(my $client = $server->accept()){
$client->autoflush(1);
my $hostinfo = gethostbyaddr($client->peeraddr);
my $hostname = $hostinfo->name || $client->peerhost;
print "Connexion from $hostname.\n";
my $child_display = new threads(\&thread_display, $client);
my $child_listen = new threads(\&thread_listen, $client);
close $client;
}
}
}
le problème se passe dans sub thread_display:
if(defined($messages[$i])){ # ligne 128
[...]
}
en effet, Perl me dit:
Use of uninitialized value in array element at ./server line 128.
Le truc c'est que j'essaie de déterminer si $messages[$i] existe justement ...
Avez vous une idée sur comment faire (j'ai essayé exists() aussi)
Mildred
# $i
Posté par tfeserver tfe (site web personnel) . Évalué à 1.
[^] # Re: $i
Posté par Mildred (site web personnel) . Évalué à 1.
Il ma suffit d'initialiser $i par défaut à 0 ....
my $current_message : shared = 0;
Parfois il y a des trucs bête comme ça
Merci beaucoup
Mildred
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.