#!/usr/bin/perl -- use strict; use warnings; use threads stack_size => 4096; use Thread::Queue; Main( @ARGV ); exit( 0 ); sub Main { my $maxJobs = 5; my $q = Threads::Queue->new; my @workers = map { threads->create( \&Worker, $q ) } 1 .. $maxJobs; my $prompter = threads->create( \&Prompter, $q, $maxJobs ); # job pusher #~ $prompter->join; #~ $_->join for @workers; $_->join for threads->list; ## wait for prompter, workers } sub Prompter { require Tkx; ### important, only thread with tkx stuff my( $q, $maxJobs ) = @_; my( $date_fic, $date_mois ) = DateFicMois(); # Time::Piece, strftime ... whatever ... AddJob( $q, $fic, $source, $rep, $cas ); ... unless( $rep_fichiers ){ SignalNoMoreJobs( $q, $maxJobs ); die "Maybe Exit9() if your heart is set on it"; } ... AddJob( $q, $fic, $source, $rep, $cas ); ... SignalNoMoreJobs( $q, $maxJobs ); return; } sub AddJob { my $q = shift; $q->enqueue( [ @_ ] ); return; } sub SignalNoMoreJobs { my( $q, $maxJobs ) = @_; $q->enqueue( undef ) for 1 .. $maxJobs; return; } sub Worker { my( $q ) = @_; while( defined( my $ficArgs = $q->dequeue ) ) { recup_fic( @$ficArgs ); } return; }